一直以来很难正确的理解Collections.sort()中自定义的比较函数Comparato的返回值与排序存在的关系;最近又梳理了一下才有了一些头绪。
要想记住这个关系,需要认识两个部分:
1. public int compare(Integer t2, Integer t1) 中两个参数的含义:
Collections.sort(list, new Comparator<Integer>() {
@Override
public int compare(Integer t2, Integer t1) {
/**
* 首先明确compare的两个参数的含义
* t2: 指的是右边的参数
* t1:指的是左边的参数
*
* 例如: 100 40 70 16 5 66
* t2: 40 ----- t1: 100
* t2: 70 ----- t1: 40
* t2: 16 ----- t1: 70
* t2: 5 ----- t1: 16
* t2: 66 ----- t1: 5
*/
System.out.println("t2: " + t2 + "-----t1: " + t1);
return 0;
}
});
2. 在Collections.sort()的源码中有这样的一段代码:
/**
* var3.compare(var0[var4++], var0[var1]) 这个就是调用我们自定义的Compare方法,
*/
if (var3.compare(var0[var4++], var0[var1]) >= 0) {
/**
* 如果返回值 >=0 , 并不会做任何有关排序的处理
*/
while(var4 < var2 && var3.compare(var0[var4], var0[var4 - 1]) >= 0) {
++var4;
}
} else {
/**
* 如果返回值 < 0 , 会执行——reverseRange(var0, var1, var4)交换顺序
*/
while(var4 < var2 && var3.compare(var0[var4], var0[var4 - 1]) < 0) {
++var4;
}
reverseRange(var0, var1, var4);
}
3. 结论
当compare的返回值小于0时,会将 t2 和 t1 (compare()中的两个参数)交换顺序,大于等于0不会变换顺序;
可根据具体的排序需求来决定是否让他们交换顺序