Collection.sort()
-功能描述:
对List集合进行排序,无返回值。
用法:
sort()中有两个参数:一个是List,也就是待排序的列表,还有一个是比较器comparator,比较器决定了集合中元素的排列方式
如果集合中的元素只是单纯的String或int等默认的数据类型的话,直接使用如下代码即可升序排序:
Collections.sort(List)
如果想要降序,则更改比较器函数
Collections.sort(List,new Comparator<List中元素的数据类型/类名>(){
public int compare(数据类型 o1,数据类型 o2){
return o2-o1;
}
})
例:
Collections.sort(list, new Comparator<Integer>() {
@Override
public int compare(Integer o1, Integer o2) {
return o2-o1;
}
});
当集合中的元素为某个类的实例时,则必须传入比较器,比较器无法省略。
Collections.sort(data, new Comparator<BackVO>() {
@Override
public int compare(BackVO o1, BackVO o2) {
return o1.getRank()-o2.getRank();
}
});
可以记住一个结论:谁在前边,谁小, o2-o1,o2小,也就是倒序排列(因为o2>o1的话会颠倒顺序,所以看作倒序排列)
原理:
Collections.sort排序原理主要基于Arrays.sort方法,使用了归并排序和快速排序两种算法。
归并排序:用于Object类型数据排序,是稳定的排序算法,能够保证相等数据的原有顺序不变。
快速排序:主要用于基本类型数据(如int, short, long等)排序,是不稳定的排序算法。
Collections.sort()方法会调用Arrays.sort()方法,该方法使用归并排序算法对数组进行排序。在排序过程中,Arrays.sort()方法会不断地将数组分割成两半,对这两半进行递归排序,然后将排序好的两半数组进行合并,最终得到一个有序的数组。
compare方法的返回值大于等于0时,相邻的两个元素o1和o2不交换位置;小于0时,相邻的两个元素o1和o2交换位置。需要注意的是,o1是List中下标较大的那个元素,o2是List中下标较小的那个元素。
所以,sort的本质就是利用比较器中的compare方法判断列表中相邻的两个元素是否发生交换。若任意两个相邻元素都不发生交换
应用模式:策略模式
Comparator 则是在外部制定排序规则,然后作为排序策略参数传递给某些类,比如 Collections.sort(), Arrays.sort(), 或者一些内部有序的集合(比如 SortedSet,SortedMap 等)。
使用方式主要分三步:
创建一个 Comparator 接口的实现类,并赋值给一个对象
在 compare 方法中针对自定义类写排序规则
将 Comparator 对象作为参数传递给 排序类的某个方法
向排序类中添加 compare 方法中使用的自定义类