【问题标题】:Collections sort method集合排序方法
【发布时间】:2016-04-03 19:44:11
【问题描述】:

http://docs.oracle.com/javase/8/docs/api/java/util/Collections.html#sort-java.util.List-java.util.Comparator-

根据由 指定的比较器。列表中的所有元素必须相互 使用指定的比较器进行比较(即 c.compare(e1, e2) 不能为任何元素 e1 和 e2 抛出 ClassCastException 列表)。

为什么不指定对象是升序还是降序排序?在Comparator 接口中,compare 方法告诉obj1 何时大于等于或小于obj2。而已。文档没有说明列表是否按升序排序。我自己检查过,是的,它正在上升。

【问题讨论】:

  • 升序或降序没有意义。它根据比较器进行排序。因此比较器可以升序或降序排序,但这取决于比较器。不是排序逻辑。
  • @Tunaki Comparator 的比较方法定义了对象何时变大或变小。 sort 方法按升序排序,通过查看比较器来判断升序的含义。但是文档没有提到顺序是升序的。

标签: java sorting collections


【解决方案1】:

当您处理自定义Comparator 时,“升序”或“降序”在这里都没有意义。 Comparator 本身强加了一些顺序,就对象的自然排序而言,可能是“升序”或“降序”,如果这种自然排序甚至存在的话。 sort 的文档说“升序”是错误,因为如果你传递给它一个强制降序排列的 Comparator,那么排序将是降序的。

错误在documentation for Comparator.compare 中。当它的真正意思是“在之前”和“之后”时,它会说“小于”和“大于”。

定义降序的Comparator 不符合文档的这个特定方面,但这只是一个文档问题。 Comparator 的其余大部分文档都没有使用这个术语,只是正确地讨论了排序。

【讨论】:

    【解决方案2】:

    集合按照给定的Comparator(或元素的自然顺序,如果它们是Comparables 并且没有提供Comparator)按升序 顺序排序。

    至于为什么文档没有明确说明 - 您必须询问 JDK 的作者,但在英语中假设排序隐含意味着升序是很常见的,并且这种约定经常延续到软件工程.例如,在 SQL 中,order by 子句隐式假定为 ASC,即使它没有明确说明。

    【讨论】:

    • 如果比较器强加一个例如根据比较器,您不会说它是“按升序”对整数进行降序排列,对吗?
    • @CupawnTae 实际上,我会,但也许这会让人毛骨悚然。 Comparator 定义了一个排序,您可以说 X 在 Y 之前(“小于”)、Y 之后(“大于”)或位置(“等于”)。 Collections.sort 根据此顺序对列表进行排序。如果它恰好是一个递减的数字顺序,那就这样吧,Collections.sort 不关心它。
    • @CupawnTae 但我想这取决于你如何看待它。
    • 我会说“升序”和“降序”是自然排序的方面,而不是Comparator 强加的顺序。所以你可以有一个强制升序的Comparator,另一个强制降序,你可以有一个Comparator的相反顺序,但是说“根据降序Comparator升序”将是有点混乱
    【解决方案3】:

    排序顺序将由ComparatorComparable 的实现决定,因此Collections.sort 方法不能保证升序或降序。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-01-03
      • 1970-01-01
      • 2020-11-05
      • 1970-01-01
      • 1970-01-01
      • 2010-10-04
      相关资源
      最近更新 更多