显然,它没有记录在案,或者我错过了。
这是文档的链接,下面是作为图像的文本:
编辑(17/5):我认为太多人将此问题混淆为比较问题。它不是。比较器在 2 个元素之间进行比较。根据该比较,列表排序。如何?上升还是下降?
我将进一步细化/简化问题:如果比较器确定元素 A 小于元素 B。在排序列表中,元素 A 是否位于比元素 B 更低的索引处?
显然,它没有记录在案,或者我错过了。
这是文档的链接,下面是作为图像的文本:
编辑(17/5):我认为太多人将此问题混淆为比较问题。它不是。比较器在 2 个元素之间进行比较。根据该比较,列表排序。如何?上升还是下降?
我将进一步细化/简化问题:如果比较器确定元素 A 小于元素 B。在排序列表中,元素 A 是否位于比元素 B 更低的索引处?
排序顺序总是升序,其中 Comparator 定义哪些项目大于其他项目。
从Collections.sort(List<T> list, Comparator<? super T> c)的文档中:
根据指定比较器产生的顺序对指定列表进行排序。
从Comparator.compare(T,T)的文档中:
比较它的两个参数的顺序。返回负整数、零或正整数,因为第一个参数小于、等于或大于第二个。
你(或者更确切地说,你的比较器)决定。
Comparator
的 '在小于compare(T o1, T o2)
时返回负数,您将获得升序(ideone 上的演示)。o1
o2
Comparator
的 '在大于compare(T o1, T o2)
时返回负数,您会得到降序(ideone 上的演示)。o1
o2
另一种说法是sort
假设比较器将传递给它的两个项目从较小 ( o1
) 到较大 ( o2
) 排序,并产生与该顺序一致的升序排序。
方法的文档Comparator.compareTo(o1, o2)
说
比较它的两个参数的顺序。返回负整数、零或正整数,因为第一个参数小于、等于或大于第二个。
因此,如果您想从自然顺序排序,即从小到大,那么您应该按照文档中的定义编写实现
public int compareTo(Integer o1, Integer o2) {
int v1 = (o1);
int v2 = (o2);
if(v1 == v2) {
return 0;
}
if(v1 < v2) {
return -1; //return negative integer if first argument is less than second
}
return 1;
}
如果您希望排序以相反的顺序排列,那就是从大到小
public int compareTo(Integer o1, Integer o2) {
int v1 = (o1);
int v2 = (o2);
if(v1 == v2) {
return 0;
}
if(v1 < v2) {
return 1; //do the other way
}
return -1;
}
根据文档 https://docs.oracle.com/javase/7/docs/api/java/util/Collections.html#sort(java.util.List,%20java.util.Comparator,集合的排序实现.sort(list, 比较器) 是合并排序。
鉴于 mergeSort 产生的结果是升序的(https://en.wikipedia.org/wiki/Merge_sort),Collections.sort(list,comparator) 的排序顺序是升序的。
也就是说,如果比较器确定元素 A 小于元素 B。在排序列表中,元素 A 将位于比元素 B 更小的索引处。