2014-06-25 65 views
0

我有一個比較像這樣:java中的ints整數首先返回負數?

Collections.sort(sortedPlayers, new Comparator<RoundPlayer>() 
{ 
    public int compare(RoundPlayer p1, RoundPlayer p2) 
    { 
     return p1.getScore() - p2.getScore(); 
    } 
}); 

排序播放器是播放器對象的列表,它們返回的分數整數,例如,200,-300,1000等

的目標比較器是對它們進行排序,使它們按降序排列,即1000,200,300。

但是,這個比較器似乎返回不穩定的結果。通常首先出現負數。

+3

它是不穩定的還是按升序排列? – clcto

+0

它看起來不穩定,但是它的設置方式,我只能用少數幾個球員進行測試。 – Nonnisi

+0

負數始終出現在自然排序中的正數之前。 http://www.mathatube.com/sitebuilder/images/number-line-600x271.png –

回答

4

只是扭轉你的返回值,您目前擁有

樣品

return p2.getScore() - p1.getScore(); //will sort in descending order 
2

如果你想降序排序,然後考慮使用Collections.reverseOrder(Comparator cmp)包裹你的Comparator

另請注意,由於整數溢出,減去兩個值是一個壞主意。您的compare邏輯是p1.getScore() - p2.getScore()。考慮 p1.score = 2147483647,p2.score = -2147483648,您的比較器將返回-1,錯誤地指示p1的得分爲小於 p2的得分。

正確的邏輯是測試<,=和>,返回-1,0和1。更好的是,Integer已實現此邏輯,所以可以簡單地委託給其compareTo方法。

return Integer.valueOf(p1.getScore()).compareTo(Integer.valueOf(p2.getScore()); 
+0

我在Google上搜索到了「android排序負數對象列表」,她在這裏向我指出了你作爲第一個結果的最佳解釋。 看來這將是一個罕見的問題,但我試圖根據他們的桶Ids對MediaStore文件列表進行排序,發現一個錯誤,我注意到bucket ID的負值可能是問題的根源。 你的信息幫了我很多。 – Eftekhari