Sort方法是Collections类中的一个静态方法,
有两种使用方式
方式一是Collections.sort(List);
ArrayList<String> strs= new ArrayList<String>();
strs.add("hjk");
strs.add("bcd");
//添加元素
for(String str:strs){
System.out.println(str);
}
Collections.sort(strs);//排序
参数是List类型,直接传入一个指定数据类型的List集合,Collections中的sort方法方法体是list.sort(null);,
null会告诉List中的sort方法并没有给一个Comparator,在sort方法中将传进来的集合用toArrays()方法转换为Object数组
将对象数组传进Arrays.sort中利用Arrays中的sort(Object[] a);
调用ComparableTimSort类中的sort方法和binarySort方法来对数组进行排序,
(多态)在ComparableTimSort类中的binarySort方法创建了Comparable接口类型的变量pivot,
(将Object类型(在例子中转的是String类型)强转成Comparable类型,子类(String类)的对象送给长辈(Comparable)的引用,)利用这个变量if (pivot.compareTo(a[mid]) < 0)回调compareTo方法
(长辈的引用打点调长辈的方法)按照给定数据类型的规则直接进行集合元素的排序
但前提是这个数据类型实现了Comparable接口,并重写了compareTo方法,
例子中的String类已经实现了Comparable接口,并重写了compareTo方法,其中的排序规则制定好了,但只能制定一种规则.
当然,这在其他数据类型中要想这样,也是一样的方法,
即, 实现了 Comparable接口, 并重写 了compareTo方法,但也是 只能制定一种规则.
方式二Collections.sort(List,Comparator);
public List<Teacher> getTeacher(){
List<Teacher> teas=new ArrayList<Teacher>();
Teacher tea1=new Teacher("zhangsan",20,10000);
Teacher tea2=new Teacher("lisi",25,10500);
Teacher tea3=new Teacher("王五",22,18000);
teas.add(tea1);
teas.add(tea2);
teas.add(tea3);
return teas;
}
public void sortAge(List<Teacher> teas){
Collections.sort(teas,new Comparator<Teacher>(){
//按年龄排序的策略实现
@Override
public int compare(Teacher o1, Teacher o2) {
int value = o1.getAge()-o2.getAge();
return value;
}
} );
}
多态:
ArrayList继承了List 创建对象teas调ArrayList重写add方法添加集合元素,
sortAge方法的参数是List类型的参数,
在Collections的类中sort()方法是调用了list接口中的sort()方法,用长辈类的
引用teas打点调长辈类的sort方法(以Comparator作为方法的参数),
底层用Comparator的参数对象回调了compare方法,所以要求重写compare方法
实现了Comparator接口的匿名的子类对象,重写了Comparator的compare方法
匿名内部类:
实现了Comparator接口的匿名的子类对象,重写了Comparator的compare方法,
回调:
TimSort这个类其中的binarySort方法中Comparator的参数对象c
if (c.compare(pivot, a[mid]) < 0)调用的是重写后的compare方法对集合进行排序
策略:
sort方法的参数有两个,一个是要排序的list数据,
另一个参数是比较器接口Comparator接口,
在此比较器中执行要排序的原则,使用比较器的方式就不用对要比较的集合中的元素类型实现Comparable接口
可以实现多个比较器,每个比较器对应一种排序原则,每次重写compare方法都是一种策略,
对数据类型不做限制,制定规则,只要重写compare方法就可以
需要注意的是:
参数的类型是List集合,
Set集合需要转成List集合,(for循环遍历)
Map集合根据需求将key用keySet()转成List集合,或将value利用values()转成List集合
因为在Collections的类中sort()方法是调用了list接口中的sort()方法,
但其中往里传的Comparator接口的匿名内部类对象(这里制定了排序的规则),
这样list接口调用的Arrays.sort方法就会接收到匿名内部类对象和