2017-04-14 68 views
0

我需要通过其中一个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代码呢?我不想在这方面重新发明轮子。

+0

听起来像是你将不得不重新实现'Comparator.comparingInt'做交换在== ==的情况下 - 不应该太难做! – alfasin

+1

@alfasin - 这种方法不起作用。如果比较器返回'compare(1,1)'以外的任何非零值,那么最终会得到一些不是有效排序的东西...并且TimSort算法会抛出一个异常(可能)。 –

+0

@StephenC https://gist.github.com/anonymous/0ff43111ef7fecf8ef6f4261a8cfde58 – alfasin

回答

6

如果目标是在相反的顺序相等的元素,你可以简单地分选前反向名单:

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

太棒了!我正在考虑在最后做出逆转(相同的元素),但这是非常简单的。 –

+0

完美!我正在寻找简单的解决方案。 – user2014969

+0

我不确定它是否有效,如果你有3个具有相同值的项目! – alfasin