2012-02-07 55 views
0

這已被問了好幾次,我知道,但幫助我理解了一些東西。按價值排序地圖,需要說明

你有你需要的價值

Map<String, Integer> m = new HashMap<String, Integer>(); 
    m.put("a", 1); 
    m.put("b", 13); 
    m.put("c", 22); 
    m.put("d", 2); 

排序的地圖你調用一個方法來做到這一點

public static List<String> sortByValue(final Map<String, Integer> unsortedMap) { 

    List<String> sortedKeys = new ArrayList<String>(); 
    sortedKeys.addAll(unsortedMap.keySet()); 

    Collections.sort(sortedKeys, new MapComparator(unsortedMap)); 

    return sortedKeys; 
} 

你有一個比較類

public MapComparator(Map<String, Integer> m) { 
    this.m = m; 
} 

@Override 
public int compare(String a, String b) { 

    int x = m.get(a); 
    int y = m.get(b); 

    if (x > y) 
     return x; 
    if (y > x) 
     return y; 

    return 0; 

} 

此代碼,顯然是有缺陷的。請幫我理解爲什麼?

回答

2
if (x > y) 
    return x; 
    if (y > x) 
    return y; 

    return 0; 

您應該返回1如果x > y-1如果y > xComparator合同規定,如果第一個值小於第二個值,則返回負數;如果第一個值大於第二個值,則返回正數;如果相等,則返回零。

(請注意,因爲它的立場,這Comparator實施將打破在非常混亂的方式,如果你碰巧使用不在原始地圖值。)

更重要的是,剛剛返回Integer.compare(x, y),這爲你做所有的事情。 (但是,只在Java 7中)。

+0

路易斯,這不起作用。結果仍然出現未排序 – JAM 2012-02-07 03:23:15

+0

使用未包含在原始映射中的值將導致「拆除」(整數)空值時出現'NullPointerException',而不是因爲編輯時出現任何問題。 – 2012-02-07 03:24:08

+0

@JAM,你可以發佈你的更新代碼嗎?這看起來應該起作用。 – 2012-02-07 03:32:33

0

比較器不會返回更大或更小的值。他們返回一個負值表示小於或正值表示大於。

if (x > y) 
    return x; 
if (y > x) 
    return y; 

return 0; 

大概應該是

if (x > y) 
    return -1; 
if (y > x) 
    return 1; 

return 0; 
0

你比較永遠只表示該值相等或左邊比右邊大。

考慮的情況下x爲1和y是2.您的比較將返回2 —正數—時,它應返回一個負數。

我建議您再次研究the Comparator interface documentation以查看您在此處錯過的合同部分。

1
@Override 
public int compare(String a, String b) { 

    Integer x = m.get(a); 
    Integer y = m.get(b); 

    return x.compareTo(y); 
} 

由於您具有Integer對象作爲值,因此可以使用隱式方法來比較對象並返回1,0或-1。

0
public static List<String> sortByValue(final Map<String, Integer> unsortedMap) { 
    List<String> sortedKeys = new ArrayList<String>(); 
    sortedKeys.addAll(unsortedMap.keySet()); 

    Collections.sort(sortedKeys, new Comparator<String>(){ 
     public int compare(String s1, String s2) { 
      return unsortedMap.get(s1).compareTo(unsortedMap.get(s2)); 
     }}); 
    return sortedKeys; 
}