Collections.sort()方法给集合排序
- 前言
因为Collections里面的sort()方法是静态方法,所以可以直接类名打点调用sort方法
- Collections.sort()有两种参数形式
第一种形式
//第一种形式Connections.sort(List<T> list)
/*情况一:传入数据内容只有一种数据类型且该类型数据已实现了Comparable接口,并重写了CompareTo方法*/
ArrayList<String> strs = new ArrayList<String>();//创建一个集合
strs.add("hjk");//添加数据
strs.add("bcd");
Collections.sort(strs);//进行排序
for (String str : strs) {//增强for循环遍历输出
System.out.println(str+" ");
}
//结果:aaa
// bbb
/*情况二:传入数据的内容是多种数据(比如自己写的类)那么要自己实现Comparable接口,并重写CompareTo方法*/
//Student为自己创建的类(有姓名,年龄,学号属性)
ArrayList<Student> stus = new ArrayList<Student>();//声明一个集合
Student stu1 = new Student("zhangsan",20,"S001");//创建Student对象
Student stu2 = new Student("lisi",21,"S002");
Student stu3 = new Student("wangwu",22,"S003");
stus.add(stu1);//向集合中添加对象
stus.add(stu2);
stus.add(stu3);
Collections.sort(stus);//排序,此时如果没有实现Comparable接口,并重写CompareTo方法,会报红波浪线错误
//Student类需要实现Comparable接口,并重写方法
/*返回值有三种,正数,负数和零
返回零表示相等
返回正数前面大于后面
返回负数后面大于前面
*/
public int compareTo(Student o) {
//因为Student有三种元素所以可以写三种排序方式但是只能选择其中一种来进行排序
//给name排序
int value = this.getName().compareTo(o.getName());
//给age排序
//int value = this.getAge()-o.getAge();
//给stuNO
//int value = this.getStuNo().compareTo(o.getStuNo());
return value;
}
/*
实现过程:
Connections.sort()方法调用了list.sort(null)方法并传入参数null,在list.sort()方法中,把集合转换成一个Object数组a
在调用数组排序Arrays.sort(a,null);在此方法中,首先判断后面参数为null,所以调用Array里面的sort()方法
在此方法中调用ComparableTimSort.sort()方法,在调用binarySort()方法
在binarySort()方法中将Object对象用Comparable接口的引用缩小范围,再用Comparable的引用打点调用compareTo的方法(以长辈的引用打点调用子辈重写的方法是多态)
*/
第二种形式
//第一种形式Connections.sort(List<T> list, Comparator<? super T>);
//第二个参数是一个比较器接口,可以同时实现多种排序原则
//这是一个准备集合的类其中Teacher为自己写的类(有姓名,年龄,薪水属性)
public List<Teacher> getTeachers(){
ArrayList<Teacher> teas = new ArrayList<Teacher>();
Teacher tea1 = new Teacher("张三",21,18000);
Teacher tea2 = new Teacher("李四",20,15000);
Teacher tea3 = new Teacher("王五",22,20000);
teas.add(tea1);
teas.add(tea2);
teas.add(tea3);
return teas;
}
//排序,根据指定Comparator的排序原则,按名称排序的策略实现
public void sortName(List<Teacher> teas){
//多态:以长辈作为方法的参数
Collections.sort(teas,new Comparator<Teacher>(){//匿名内部类
//回调函数
@Override
public int compare(Teacher o1, Teacher o2) {
int value = o1.getName().compareTo(o2.getName());
return value;
}
});
}
//排序,根据指定Comparator的排序原则,按年龄排序的策略实现
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;
}
});
}
/*
所用到的知识点:(了解)
策略设计模式,按照不同的策略实现排序效果
多态:以Comparator接口作为sort()方法的参数
匿名内部类:在sort方法的内部直接重写Compartor接口里面的compare方法
回调函数:Collections的类调用sort()方法,在这个sort放里面在调用List的srot(c)方法,
在List的srot()方法里面调用toArray()方法将集合中的元素转换成一个Object数组,在调用Arrays.sort()方法
数组排序Arrays.sort(a,c)方法中有两个参数,在此方法中有一个判断,c不为bull所以执行else里面的TimSort.sort方法
在TimSort.sort()方发里面调用TimSort类里面的binarySort(),
最后在binarySort()里面回调自己所写的排序策略里面的compare()方法,这就是回调函数的回调流程
*/
总结
第一次对一个方法的源码找到,这么深,可能自己的理解有一些错误,欢迎大家评论,帮我就纠正错误,我会努力完善的