Java的Collections.sort(列表,比较器)的排序顺序是什么?从小到大还是从大到小?

Ali*_*aka 39 java sorting collections comparator

显然,它没有记录,或者我错过了它.

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

编辑(17/5):我认为太多人把这个问题混淆为比较问题.它不是.比较器比较2个元素.根据那个比较,列表排序.怎么样?升序还是降序?

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

在此输入图像描述

And*_*mas 34

排序顺序始终是升序,比较器定义哪些项比其他项大.

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

根据指定比较器引发的顺序对指定列表进行排序.

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

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

  • 为什么你认为排序列表是升序的? (4认同)
  • 观察.在调用该方法之后,根据比较器提供的定义,列表从最小成员到最大成员排列.在观察之前,我会猜到与兄弟方法Collections.sort(List <T>)并行的升序,**被明确记录为升序.您正在使用的方法的文档将通过明确提及升序来改进,就像它的兄弟一样. (4认同)

das*_*ght 20

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

  • 如果你Comparatorcompare(T o1, T o2)回报是负数o1小于o2,你得到升序(在ideone上演示).
  • 如果你Comparatorcompare(T o1, T o2)回报是负数o1大于o2,你得到降序(在ideone上演示).

说同样事情的另一种方式是sort假设比较器命令传递给它的两个项从small(o1)到greater(o2),并产生与该排序一致的升序排序.

  • 与比较器合同更一致的另一种看待这种情况的方法是,比较器定义哪些项目小于,等于或大于其他项目. (5认同)
  • @kilaka它总是相对于比较器升序:如果你的比较器是倒置的,并且它说“小于”,而实际上它大于,那么输出是按降序排列的。 (2认同)

san*_*hat 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;
}
Run Code Online (Sandbox Code Playgroud)

如果你希望排序是相反的,那就是大到小

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;
}
Run Code Online (Sandbox Code Playgroud)