【问题标题】:Does Collections.sort keep order on equal elements?Collections.sort 是否保持相同元素的顺序?
【发布时间】:2015-04-21 05:47:06
【问题描述】:

我有一个按日期参数排序的对象列表,并希望按类别参数对它们重新排序,但将日期顺序保持在类别内。

这样的事情就足够了吗,还是我必须实现一个比较器来考虑同一类别对象的日期?

// sort the list by category asc(, date asc )
Collections.sort((List<Object>)entries, new Comparator<Object>() {

    @Override public int compare(Object elementA, Object elementB) {
        return elementA.category.compareTo(elementB.category); // what happens when elementA.category.equals(elementB.category)?
    }

});

【问题讨论】:

  • IMO 如果您需要按某事进行排序,按某事进行排序——不要让它碰运气,或另一种排序的结果。
  • Collections.sort 在幕后使用Arrays.sort,它执行合并排序。该合并排序的代码是here
  • 最好先阅读 Javadoc 中的某个方法,然后再在 Stack Overflow 上询问该方法的确切用途。在这种特殊情况下,Javadoc 非常非常清楚地回答了您的问题。
  • 感谢您清除它!我实际上在写问题时在文档上找到了This sort is guaranteed to be stable: equal elements will not be reordered as a result of the sort.,但我不确定equal elements 是指比较器的结果还是实际上将元素(而不是它们的属性)与objectA.equals(objectB) 进行比较,我知道很可能不会是这样,但我想 100% 确定(我什至做了一个测试来检查它,但我想要一些批准,以防这只是巧合,我想这有点偏执)。

标签: java sorting collections comparator


【解决方案1】:

您问题中的代码将满足您的需求,因为Collections.sort() 确实保留了相等元素的顺序。

来自documentation

这种排序保证稳定:相同的元素不会因为排序而重新排序。

换句话说,如果条目是按sort() 之前的日期排序的,那么它们将在sort() 之后的每个类别中保持按日期排序

如果您不想依赖原始排序,您可以轻松扩展比较器以首先比较类别,然后使用日期打破平局。

【讨论】:

    猜你喜欢
    • 2016-07-14
    • 1970-01-01
    • 1970-01-01
    • 2020-04-21
    • 2020-03-31
    • 1970-01-01
    • 2020-11-01
    • 2010-11-23
    • 2012-10-23
    相关资源
    最近更新 更多