2015-04-05 56 views
0

我有一個填充DMatch對象的列表,此對象包含屬性「distance」。比較器類顯示錯誤排序

我想要做的是根據「距離」遞增或desceningly那種名單。

在下面的代碼

我用比較器類和sorte D出現列表desceingly,但指數(8,9,10,11)的輸出,他不排序良好。

請讓我知道我在做什麼錯誤,以及如何解決這個錯誤

代碼

Collections.sort(list_RawMatchesMatDMatch, ascOrder); 
       for (int i = 0; i < list_RawMatchesMatDMatch.size(); i++) { 
        Log.D(TAG, "main", "rawMatDMatchLiat(" + i + ").distance: " + list_RawMatchesMatDMatch.get(i).distance);       
       } 

    static Comparator<DMatch> ascOrder = new Comparator<DMatch>() { 

    public int compare(DMatch arg0, DMatch arg1) { 
     // TODO Auto-generated method stub 

     return (int) (arg1.distance - arg0.distance); 

    } 
}; 

輸出

Debug: MainClass -> main: rawMatDMatchLiat(0).distance: 454.26645 
Debug: MainClass -> main: rawMatDMatchLiat(1).distance: 447.3835 
Debug: MainClass -> main: rawMatDMatchLiat(2).distance: 442.294 
Debug: MainClass -> main: rawMatDMatchLiat(3).distance: 438.98862 
Debug: MainClass -> main: rawMatDMatchLiat(4).distance: 433.11084 
Debug: MainClass -> main: rawMatDMatchLiat(5).distance: 427.35114 
Debug: MainClass -> main: rawMatDMatchLiat(6).distance: 426.2335 
Debug: MainClass -> main: rawMatDMatchLiat(7).distance: 425.16232 
Debug: MainClass -> main: rawMatDMatchLiat(8).distance: 423.816 
Debug: MainClass -> main: rawMatDMatchLiat(9).distance: 423.6815 
Debug: MainClass -> main: rawMatDMatchLiat(10).distance: 424.51855 
Debug: MainClass -> main: rawMatDMatchLiat(11).distance: 424.66693 
Debug: MainClass -> main: rawMatDMatchLiat(12).distance: 423.53986 
Debug: MainClass -> main: rawMatDMatchLiat(13).distance: 423.79712 
Debug: MainClass -> main: rawMatDMatchLiat(14).distance: 423.62012 
Debug: MainClass -> main: rawMatDMatchLiat(15).distance: 421.72028 
Debug: MainClass -> main: rawMatDMatchLiat(16).distance: 419.46274 
Debug: MainClass -> main: rawMatDMatchLiat(17).distance: 418.12198 

回答

6

這是沒有好:

return (int) (arg1.distance - arg0.distance); 

因爲int cast會截斷結果。相反,這樣做:

if (arg1.distance > arg0.distance) { 
    return 1; 
} else if (arg1.distance < arg0.distance) { 
    return -1; 
} else { 
    return 0; 
} 

或者更好:

return Double.compare(arg1.distance, arg0.distance); 
+0

@Pshemo:是的,記得和糾正它。 – 2015-04-05 11:37:22

+0

但爲什麼「公共int比較(DMatch arg0,DMatch arg1)」的方法總是「int」我試圖讓浮動,但這是不可能的 – rmaik 2015-04-05 11:43:26

+0

@rmaik:我不明白你的意見 - 請解釋。 – 2015-04-05 11:45:32