2017-04-14 109 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