Collections.sort

Collection.sort()

-功能描述:
对List集合进行排序,无返回值。

用法:

sort()中有两个参数:一个是List,也就是待排序的列表,还有一个是比较器comparator,比较器决定了集合中元素的排列方式

如果集合中的元素只是单纯的String或int等默认的数据类型的话,直接使用如下代码即可升序排序:
Collections.sort(List)

如果想要降序,则更改比较器函数
Collections.sort(List,new Comparator(){
        public int compare(数据类型 o1,数据类型 o2){
            return o2-o1;
        }
})
例:
Collections.sort(list, new Comparator() {
@Override
 public int compare(Integer o1, Integer o2) {
             return o2-o1;
         }
});

当集合中的元素为某个类的实例时,则必须传入比较器,比较器无法省略。
  Collections.sort(data, new Comparator() {
                @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()方法会不断地将数组分割成两半,对这两半进行递归排序,然后将排序好的两半数组进行合并,最终得到一个有序的数组。

Collections.sort_第1张图片

compare方法的返回值大于等于0时,相邻的两个元素o1和o2不交换位置;小于0时,相邻的两个元素o1和o2交换位置。需要注意的是,o1是List中下标较大的那个元素,o2是List中下标较小的那个元素。
所以,sort的本质就是利用比较器中的compare方法判断列表中相邻的两个元素是否发生交换。若任意两个相邻元素都不发生交换

应用模式:策略模式
Comparator 则是在外部制定排序规则,然后作为排序策略参数传递给某些类,比如 Collections.sort(), Arrays.sort(), 或者一些内部有序的集合(比如 SortedSet,SortedMap 等)。
使用方式主要分三步:
创建一个 Comparator 接口的实现类,并赋值给一个对象  
在 compare 方法中针对自定义类写排序规则
将 Comparator 对象作为参数传递给 排序类的某个方法
向排序类中添加 compare 方法中使用的自定义类

你可能感兴趣的:(算法)