【问题标题】:What's the sort order of Java's Collections.sort(list, comparator)? small to big or big to small?Java 的 Collections.sort(list,comparator) 的排序顺序是什么?从小到大还是从大到小?
【发布时间】:2013-07-12 14:10:00
【问题描述】:

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

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

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

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

【问题讨论】:

  • 看你怎么写Comparator?
  • 你查看过Comparator的API吗?它允许您定义自己的排序顺序。
  • 请看我从 15/7 开始的编辑。

标签: java sorting collections comparator


【解决方案1】:

排序顺序总是升序,其中比较器定义哪些项目比其他项目大。

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

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

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

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

【讨论】:

  • 为什么你认为排序的列表是升序的?
  • 观察。调用该方法后,根据比较器提供的定义,列表从最小成员到最大成员排列。在观察之前,我会猜测使用兄弟方法 Collections.sort(List) 的并行性升序,is 明确记录为升序。您正在使用的方法的文档将通过明确提及升序得到改进,就像它的兄弟一样。
【解决方案2】:

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

  • 如果您的Comparatorcompare(T o1, T o2)o1 小于o2 时返回负数,您将获得升序(demo on ideone)。
  • 如果您的Comparatorcompare(T o1, T o2)o1 大于o2 时返回负数,您将得到降序排列(demo on ideone)。

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

【讨论】:

  • 另一种看待这一点的方式,更符合 Comparator 合同,是 Comparator 定义哪些项目小于、等于或大于其他项目。
  • 第二句不应该是return a positive when o1 is less than o2吗?否则,它的排序方式与第一句相同。
  • @nif 你是对的,我应该“反转”条件的一部分,而不是两者。谢谢!
  • 为什么你认为排序的列表是升序的?
  • @kilaka 它总是相对于比较器升序:如果你的比较器是倒置的,并且它说“小于”而实际上它大于,那么输出是降序的。跨度>
【解决方案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;
}

【讨论】:

    【解决方案4】:

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

    鉴于mergeSort 产生的结果是升序的(https://en.wikipedia.org/wiki/Merge_sort),Collections.sort(list,comparator) 的排序顺序是升序的。

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-06-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-07-04
      • 2020-09-18
      相关资源
      最近更新 更多