【问题标题】:Opposite of Stable Sort in Java (Unstable?)与 Java 中的稳定排序相反(不稳定?)
【发布时间】:2017-04-14 00:47:59
【问题描述】:

我需要通过其中一个参数对 Java 中的对象列表进行排序。这很好用,当有平局时,它会保持以前的顺序。

但是,我的目标是移植一些自行排序的丑陋代码,并且我必须保留相同的行为。在该算法中,如果出现平局,它会反转先前的顺序。

例如,如果我想按 int 对这些对象进行排序:

{ a, 1}
{ b, 2}
{ c, 1}

我的代码返回:a、c、b

我要移植的代码返回:c、a、b

我现在的代码是:

final Comparator<MyObj> myComparator =
    Comparator.comparingInt(MyObj::getSortWeight)
return myObjList
    .stream()
    .sorted(myComparator)
    .map(//doing some other transformations here)
    .collect(Collectors.toList());

有没有一种非 hacky 的方法可以让它像旧代码一样工作?我不想重新发明轮子。

【问题讨论】:

  • 听起来你必须重新实现 Comparator.comparingInt 并在 == 的情况下进行交换 - 应该不难做到!
  • @alfasin - 这种方法行不通。如果比较器为compare(1, 1) 返回任何非零值,那么您最终将得到不是有效排序的结果......并且 TimSort 算法将抛出异常(可能)。
  • 我对此发表了评论。
  • 这里要非常小心。旧排序很可能不会总是颠倒相等项目的顺序。当有两个以上的项目具有相同的值时尤其如此。

标签: java sorting java-stream comparator


【解决方案1】:

如果目标是使相同的元素以相反的顺序排列,您可以在排序前简单地反转列表:

List<MyObj> copy = new ArrayList<>(myObjList);
Collections.reverse(copy);
return copy.stream()
    .sorted(myComparator)
    .map(//doing some other transformations here)
    .collect(Collectors.toList());

【讨论】:

  • 太棒了!我想在最后做(相等元素的)反转,但这要简单得多。
  • 完美!正是我正在寻找的简单解决方案。
  • @alfasin 我没有看到问题。你能说得更具体点吗?
  • @alfasin List.stream() 返回一个有序流,因为它派生自有序的List.spliterator()
  • @alfasin 谁在讨论自然排序?我什至不确定你要说什么了。也许考虑一下并尝试生成一些代码来演示问题,假设有一个。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-06-02
  • 2016-05-23
  • 1970-01-01
  • 2010-09-11
  • 2011-06-01
相关资源
最近更新 更多