43

显然,它没有记录在案,或者我错过了。

是文档的链接,下面是作为图像的文本:

编辑(17/5):我认为太多人将此问题混淆为比较问题。它不是。比较器在 2 个元素之间进行比较。根据该比较,列表排序。如何?上升还是下降?

我将进一步细化/简化问题:如果比较器确定元素 A 小于元素 B。在排序列表中,元素 A 是否位于比元素 B 更低的索引处?

在此处输入图像描述

4

4 回答 4

38

排序顺序总是升序,其中 Comparator 定义哪些项目大于其他项目。

Collections.sort(List<T> list, Comparator<? super T> c)的文档中:

根据指定比较器产生的顺序对指定列表进行排序。

Comparator.compare(T,T)的文档中:

比较它的两个参数的顺序。返回负整数、零或正整数,因为第一个参数小于、等于或大于第二个。

于 2013-07-14T17:51:36.747 回答
22

你(或者更确切地说,你的比较器)决定。

  • 如果您Comparator的 '在小于compare(T o1, T o2)时返回负数,您将获得升序(ideone 上的演示)。o1o2
  • 如果您Comparator的 '在大于compare(T o1, T o2)时返回负数,您会得到降序(ideone 上的演示)。o1o2

另一种说法是sort假设比较器将传递给它的两个项目从较小 ( o1) 到较大 ( o2) 排序,并产生与该顺序一致的升序排序。

于 2013-07-14T17:44:36.580 回答
5

方法的文档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;
}
于 2013-07-14T17:47:51.707 回答
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 更小的索引处。

于 2017-09-07T20:32:18.800 回答