对面的Java中的稳定排序(不稳定?)
我需要通过其中一个params对Java中的对象列表进行排序。这工作得很好,当有一个领带时,它保持以前的顺序。对面的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());
是否有非哈克的方式使其相同的方式工作为邻ld代码呢?我不想在这方面重新发明*。
如果目标是在相反的顺序相等的元素,你可以简单地分选前反向名单:
List<MyObj> copy = new ArrayList<>(myObjList);
Collections.reverse(copy);
return copy.stream()
.sorted(myComparator)
.map(//doing some other transformations here)
.collect(Collectors.toList());
太棒了!我正在考虑在最后做出逆转(相同的元素),但这是非常简单的。 –
完美!我正在寻找简单的解决方案。 – user2014969
我不确定它是否有效,如果你有3个具有相同值的项目! – alfasin
听起来像是你将不得不重新实现'Comparator.comparingInt'做交换在== ==的情况下 - 不应该太难做! – alfasin
@alfasin - 这种方法不起作用。如果比较器返回'compare(1,1)'以外的任何非零值,那么最终会得到一些不是有效排序的东西...并且TimSort算法会抛出一个异常(可能)。 –
@StephenC https://gist.github.com/anonymous/0ff43111ef7fecf8ef6f4261a8cfde58 – alfasin