提示:
分析过程是个人的一些理解,如有不对的地方,还请大家见谅,指出错误,共同学习。
源码分析过程中由于我写的注释比较啰嗦、比较多,导致文中源代码不清晰,还请一遍参照源代码,一遍参照本文进行阅读。
原理:先将集合中的部分元素排列好顺序。 然后再将剩余的元素用二分法插入到已排好序(二分法的使用是建立在已排好序的前提下)的元素中去。然后得到排好序的集合。
测试代码:
1 public classTestLambda {2 public static List list = Arrays.asList("my","name","is","lambda","mzp");3 public static List integerList = Arrays.asList(1,2,15,6,9,13,7);4
5 public static voidmain(String[] args) {6 System.out.println("排序前:");7 printList(integerList);8 oldIntegerSort();9 System.out.println("\noldSort排序后:");10 printList(integerList);11 }12
13
14 /**
15 * @Author maozp316 * @Description: 对String类型的lis就行排序。使用老方法(外部比较器Comparator)17 * @Date: 14:51 2019/7/518 * @Param []19 *@returnvoid20 **/
21 public static voidoldIntegerSort(){22 //排序(匿名函数)
23 Collections.sort(integerList, new Comparator(){24 //使用新的排序规则。比较器排序。25 //原理,先确定部分元素的顺序(升序或是降序),然后把剩余的元素通过"二分插入"进行排序。
26 @Override27 public int compare(Integer a, Integer b) { //源码中第一个入参(a)是数组靠后面的数,第二个入参(b)是数组靠前面的数(比如这里:a=2,b=1)
28 if(a <= b){ //由条件加上返回值来确定是升序还是降序 (如果全部返回-1的话,则实现逆序,将集合中的元素顺序颠倒)
29 return 1; //比如这里:原数组后面a的数小于前面的数b,返回1,1则表示这个顺序不需要调整。
30 }else{31 return -1; //比如这里:原数组后面的数a小于前面的数b,返回-1,-1则表示数组中现在的顺序需要调整。根据我们的代码,前两个元素是1和2,判断条件if(2<=1),返回的是-1,即不满足我们的期望。 下面排序的时候就会对顺序进行调整了。
32 }33 }34 });35 }36
37
38 /**
39 * @Author maozp340 * @Description: 打印集合元素41 * @Date: 10:38 2019/7/842 * @Param [list]43 *@returnvoid44 **/
45 public static void printList(Listlist){46 Iterator iterator =list.iterator();47 while(iterator.hasNext()){48 System.out.print(iterator.next()+",");49 }50 }
51 }
重写 Comparator 中的 compare 方法。自定义的比较规则:我这里自定义的比较器是: 期望得到 逆序排列
判断条件是:当a<=b时,返回1。否则返回-1;意思就是我期望的是“后一个元素比前一个元素小(即降序)”,如果已经满足,就不需要调换顺序(返回1),如果不满足,就需要调换一下顺序(返回-1)。
源码分析时,有一个我自己定义的“理念”,对于这个“理念”,这里有一个比较好的理解方法: a和b作比较时,a是比较者(主动),b就相当于是参照物(被比较者、被动)。
下面源码分析时用到这个所谓的“理念”的时候,会用到“主动”和“被动”这两个说辞。
测试数据:1,2,15,6,9,13,7
1 public static voidoldIntegerSort(){2 //排序(匿名函数)
3 Collections.sort(integerList, new