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

时间:2013-07-14 17:40:56

标签: java sorting collections comparator

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

Here是文档的链接,下面是文字图片:

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

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

enter image description here

4 个答案:

答案 0 :(得分:32)

排序顺序始终为升序,其中比较器定义哪些项目比其他项目大。

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

  

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

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

  

比较其订单的两个参数。当第一个参数小于,等于或大于第二个参数时,返回负整数,零或正整数。

答案 1 :(得分:20)

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

  • 如果Comparator的{​​{1}}在compare(T o1, T o2)小于o1时返回否定,则会得到升序(demo on ideone)。
  • 如果o2的{​​{1}}在Comparator大于compare(T o1, T o2)时返回否定,则会降序(demo on ideone)。

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

答案 2 :(得分:3)

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;
}

答案 3 :(得分:0)

根据 文档https://docs.oracle.com/javase/7/docs/api/java/util/Collections.html#sort(java.util.List,%20java.util.Comparator,Collections.sort(列表,比较器)的排序实现是mergeSort。

鉴于mergeSort产生的结果是升序(https://en.wikipedia.org/wiki/Merge_sort),Collections.sort(列表,比较器)的排序顺序是递增的。

也就是说,如果比较器确定元素A小于元素B.在排序列表中,元素A将位于比元素B小的索引处。