比较器
比较器,其实就是在创建TreeSet集合的时候,在构造方法中指定具体的比较方式,Comparator是一个接口,
public class TreeSetDemo {
public static void main(String[] args) {
//按照姓名进行排序
// Set set = new TreeSet(new ComparatorByName());
ComparatorByName comparatorByName = new ComparatorByName();
Set set = new TreeSet(comparatorByName);
set.add(new Student("小一6",21));
set.add(new Student("小一8",21));
set.add(new Student("小一5",25));
set.add(new Student("小一4",18));
set.add(new Student("小一7",20));
for (Iterator it = set.iterator(); it.hasNext();) {
System.out.println( it.next());
}
}
}
//创建比较器
class ComparatorByName extends Object implements Comparator/*比较器*/{
@Override
public int compare(Object o1, Object o2) {
// 1.因为要比较的是学生对象的姓名
Student s1 = (Student)o1;
Student s2 = (Student)o2;
// System.out.println(s1.getName() +"====="+s2.getName());
// 2.比较主要条件
int temp = s1.getName().compareTo(s2.getName());
//如果主要条件相同,则比较次要条件
return temp==0?s1.getAge()-s2.getAge():temp;
}
}
ForEach
//增强for循环
/*
* 格式:
* for(元素数据类型 变量:Collection或者数组){}
*
*
* */
public static void main(String[] args) {
List list = new ArrayList();
list.add("tanzhou1");
list.add("tanzhou2");
list.add("tanzhou3");
list.add("tanzhou4");
//只能遍历元素
// 注意:新的for循环必须有被遍历的目标,只能是集合或者数组
for(Object str : list){
System.out.println(str);
}
System.out.println("================");
int[] arr = {1,2,3};
for(int x=0;x<arr.length;x++){
System.out.println(arr[x]);
}
System.out.println("================");
for(int a:arr){
System.out.println(a);
}
System.out.println("================");
for (Iterator iterator = list.iterator(); iterator.hasNext();) {
Object object = (Object) iterator.next();
}
}
}
泛型的使用
public static void main(String[] args) {
List<String> list = new ArrayList<String>();
// 在创建集合的时候,直接在集合上明确要存储的元素的类型
// 泛型只能定义引用数据类型
list.add("abc");
// list.add(1);//让编写代码的时候就报错,只要不是指定类型的对象,编译器检查会报错
// 将运行时期出的问题提前转移到了编译时期,从类转换异常变成了编译失败
// 泛型
list.add("zzz");
// 获取字符串的长度
for (Iterator<String> it = list.iterator(); it.hasNext();) {
// Object obj = it.next();
// String str = (String)obj;//java.lang.ClassCastException
// System.out.println(str.length());//3
String next = it.next();
}
/*
1.安全机制
2.将运行时期出的问题提前转移到了编译时期
3.泛型技术是给编译器使用的
4.避免了强转
*/
// Demo<Demo> d = new Demo<Demo>();
// d.add(1);
}
}
//class Demo<E>{//类泛型
//
// public void add(int x){}
//
//}
例:
public static void main(String[] args) {
//想要按照字符串的长度进行排序
Set<String> s = new TreeSet<String>(new Comparator<String>() {
@Override
public int compare(String s1, String s2) {
//强转
// String s1 = (String)o1;
// String s2 = (String)o2;
// 字符串的长度
int temp = s1.length() - s2.length();
return temp==0?s1.compareTo(s2):temp;
}
});
s.add("xi");
s.add("abcd");
s.add("zza");
for(Iterator<String> it = s.iterator();it.hasNext();){
String str = it.next();
System.out.println(str);
}
}
}
例:
public static void main(String[] args) {
// Tool t = new Tool();
// t.setObj("abc");
// jdk1.5之前,为了提高工具的扩展性,用的就是Object来进行扩展,但是这种方式虽然提高了扩展,但是容易产生类转换异常
// 在jdk1.5之后,就有了泛型技术,在定义的时候将不确定的类型定义成参数
//
// t.setObj(1);
// String str = (String)t.getObj();
// System.out.println(str);
// t.setObj(1);
Tool1_6<String> t = new Tool1_6<String>();
t.setObj("abc");
String str = t.getObj();
Tool1_6<Integer> t2 = new Tool1_6<Integer>();
t2.setObj(1);
}
}
//工具类
//泛型类
class Tool1_6<Q>{//形式参数 Tool1_6<String> t = new Tool1_6<String>();
private Q obj;
public Q getObj() {
return obj;
}
public void setObj(Q obj) {//Object obj = "abc";
this.obj = obj;
}
}
public static void main(String[] args) {
Util<String> s = new Util<String>();
s.show("abc");
Util<Integer> i = new Util<Integer>();
// 不依赖于对象的泛型来确定方法的类型
i.print(1);
i.show("String");
i.show(new Exception());
}
}
class Util<W>{
//显示
// 当方法操作的类型不确定和类上的泛型一致,可以将泛型定义在方法上
// 泛型方法
// 可以是静态方法,也可以是非静态方法
public static <Q> void show(Q q){
System.out.println(q);
}
//打印
// 如果方法是静态的,就不可以使用类泛型,如果需要使用泛型,那么就必须要将方法设置为泛型方法
public /*static*/ void print(W w){
System.out.println(w);
}
//泛型类中不一定所有的方法都使用泛型,一般只是这个方法操作的类型在不确定的情况下,才使用范围
public void test(String s){
}
接口定义泛型
public static void main(String[] args) {
InterImpl2<String> t = new InterImpl2<String>();
t.show("abc");
}
}
//想要操作对象,但是对象不知道是什么类型
interface Inter<E>{//只有在定义的时候才会写这种形式参数泛型
//显示
public void show(E e);
// public void show(String e);
}
//实现类
class InterImpl implements Inter<String>{//使用的时候传递对应的泛型参数
@Override //重写的方法
public void show(String e) {
}
//重载方法
public void show(Integer e) {
}
}
//实现类要操作的元素类型不确定
class InterImpl2<T> implements Inter<T>{
@Override
public void show(T e) {
}
}
泛型中问号的作用
**
* 泛型的高级内容:
* 上限
* 下限
* public TreeSet(Comparator<? super E> comparator)
* public TreeSet(Collection<? extends E> c)
*
*/
public class GenericDemo {
//coco 18 工作....---->描述对象并且封装
//如果有很多个对象 全部都存到集合
public static void main(String[] args) {
//存储学生对象
List<Student> list = new ArrayList<Student>();
list.add(new Student("小明",18));
list.add(new Student("小红",18));
printList(list);
//存储学生对象
List<Student> list2 = new ArrayList<Student>();
list2.add(new Student("小白",18));
list2.add(new Student("小黑",18));
printList(list2);
Set<Student> set = new HashSet<Student>();
set.add(new Student("小美",18));
set.add(new Student("小王",18));
// printList(set); 因为方法的参数需要是一个List集合,传入set报错
printList(set);
List<String> list3 = new ArrayList<String>();
list3.add("小白");
list3.add("小黑");
printList(list3);
}
//打印不同list集合的迭代器
// public static void printList(List<Student> list) {
// for (Iterator<Student> it = list.iterator(); it.hasNext();) {
// Student student = it.next();
// System.out.println(student);
// }
// }
//泛型:定义的时候就是形参 ,在使用的时候就是实参
// 通配符
public static void printList(Collection<?> list) {//?代表的是实参
for (Iterator<?> it = list.iterator(); it.hasNext();) {
}
}
}
class Student extends Person {
public Student(String name, int age) {
super(name,age);
}
public Student() {
super();
}
}
class Worker extends Person{
public Worker(String name, int age) {
super(name,age);
}
public Worker() {
super();
// TODO Auto-generated constructor stub
}
}
泛型的上限
public class GenericDemo2 {
public static void main(String[] args) {
List<Student> list = new ArrayList<Student>();
list.add(new Student("小明",18));
list.add(new Student("小红",18));
printList(list);
List<Worker> list2 = new ArrayList<Worker>();
list2.add(new Worker("小明",18));
list2.add(new Worker("小红",18));
printList(list2);
Set<Student> set = new HashSet<Student>();
set.add(new Student("小美",18));
set.add(new Student("小王",18));
printList(set);
}
// 需求:除了学生就是工人
// 上限: <? extends E> :可以接收E类型或者E的子类型
// 下限:<? super E>:可以接收E类型或者E的父类型
public static void printList(Collection<? extends Person> list) {
for (Iterator<? extends Person> it = list.iterator(); it.hasNext();) {
Person p = it.next();
System.out.println(p.getName());
}
}
}
上限在Java中的定义
public class Person implements Comparable<Person>{
private String name;
private int age;
public Person(String name, int age) {
super();
this.name = name;
this.age = age;
}
@Override
public String toString() {
return getClass()+" [name=" + name + ", age=" + age + "]";
}
public Person() {
super();
// TODO Auto-generated constructor stub
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
@Override
public int compareTo(Person o) {
int temp = this.age - o.age;
return temp==0?this.name.compareTo(o.name):temp;
}
}
public class GenericDemo3 {
public static void main(String[] args) {
Collection<Student> p = new ArrayList<Student>();
p.add(new Student("小红1",21));
p.add(new Student("小红2",20));
// 把p集合添加到set集合中
TreeSet<Person> set = new TreeSet<Person>(p);
set.add(new Person("小红3",19));
//student 继承 person 里面的所有方法都可以被继承
/*
* 模拟
* class TreeSet<E>{
*
* public TreeSet(Collection<? extends Person> c){}
*
* }
*
*
*
* */
for (Iterator<Person> it = set.iterator(); it.hasNext();) {
Person person = it.next();
System.out.println(person);
}
}
}
泛型的下限
public static void main(String[] args) {
TreeSet<Student> set = new TreeSet<Student>(new ComparatorByWorkerName());
set.add(new Student("小红1",19));
set.add(new Student("小红3",0));
set.add(new Student("小红2",1));
set.add(new Student("小红4",9));
TreeSet<Worker> set2 = new TreeSet<Worker>(new ComparatorByWorkerName());
set2.add(new Worker("小红1",19));
set2.add(new Worker("小红3",0));
set2.add(new Worker("小红2",1));
set2.add(new Worker("小红4",9));
/*
* class TreeSet<E>{//Student
*
* public TreeSet(Comparator<? super E > c){} //Person
*
* }
*
*
* */
for (Iterator<Student> it = set.iterator(); it.hasNext();) {
Student person = it.next();
System.out.println(person);
}
}
}
//class ComparatorByName implements Comparator<Student>{
按照姓名进行排序
// @Override
// public int compare(Student o1, Student o2) {
// int temp = o1.getName().compareTo(o2.getName());
// return temp==0?o1.getAge()-o2.getAge():temp;
// }
//
//
//}
//都是比较器,并且都是比较姓名。只是类型不同
// Student和Worker虽然是不同的类型,但是他们有共性,就是Person
class ComparatorByWorkerName implements Comparator<Person>{
//按照姓名进行排序
@Override
public int compare(Person o1, Person o2) {//Person o1 = new Student("小红4",9)
// Person o1 = new Worker("小红1",19);o1.getName();
int temp = o1.getName().compareTo(o2.getName());
return temp==0?o1.getAge()-o2.getAge():temp;
}
}
集合和数组的工具类
//是用操作集合的工具类,这里面方法都是静态的,直接由类名调用
public static void main(String[] args) {
//获取最值
// Collection<String> c = new ArrayList<String>();
List<String> c = new ArrayList<String>();
c.add("abc");
c.add("coco");
c.add("zz");
c.add("tanzhou");
String max = Collections.max(c);
System.out.println(max);
String min = Collections.min(c);
System.out.println(min);
// 对list集合进行排序
// Collections.sort(c);
// System.out.println(c);
// 不想按照默认的方式排序
Collections.sort(c, new Comparator<String>() {
@Override
public int compare(String o1, String o2) {
int temp = o2.length()-o1.length();
return temp==0?o2.compareTo(o1):temp;
}
});
// 打印
System.out.println(c);
}
}
数组的工具类
/**
* 数组的工具类
* @author xq
*
*
*/
public class ArraysTool {
public static void main(String[] args) {
Integer[] arr = {12,55,11,8,59};
// 排序:冒泡或者选择
// 快速排序
Arrays.sort(arr);//默认是从小到大排
//遍历
// for (int i = 0; i < arr.length; i++) {
// System.out.println(arr[i]);
// }
Arrays.sort(arr,new Comparator<Integer>() {
@Override
public int compare(Integer o1, Integer o2) {
//Integer在设计的时候就实现了自然排序,重写了比较方法
return o2.compareTo(o1);
}
});
// 打印
System.out.println(Arrays.toString(arr));
// 数组转集合?扩展
// 集合转数组?限制
}
}