【发布时间】: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