2011-08-29 65 views
4

我有一個ArrayListHashMap。每個HashMap包含許多鍵值對。我想通過HashMap中的密鑰distance的值對ArrayList進行排序。Sorting HashMap

ArrayList<HashMap<String, String>> arrayListHashMap = 
    new ArrayList<HashMap<String, String>>(); 

{ 
    HashMap hashMap = new HashMap<String, Object>(); 
    hashMap.put("key", "A key"); 
    hashMap.put("value", "B value"); 
    hashMap.put("distance", 2536); 

    arrayListHashMap.add(hashMap); 
} 

{ 
    HashMap hashMap = new HashMap<String, String>(); 
    hashMap.put("key", "B key"); 
    hashMap.put("value", "A value"); 
    hashMap.put("distance", 2539); 
    arrayListHashMap.add(hashMap); 
} 

回答

6

您可以嘗試進行排序用自定義比較器:

Collections.sort(arrayListHashMap, new Comparator<HashMap<String, String>>() { 

    @Override 
    public int compare(HashMap<String, String> m1, HashMap<String, String> m2) { 
     return Integer.valueOf(m1.get("distance")).compareTo(Integer.valueOf(m2.get("distance"))); 
    } 
}); 

請注意,我假設你的所有值都是字符串,在你的例子中不是這種情況(距離是一個int值)。

+0

雖然這種方式是正確的,但它有時並沒有給出正確的結果,當值是雙倍 – user687022

8

所有HashMap S添加到列表,並使用自定義Comparator這樣的排序是:

Collections.sort(arrayListHashMap, new Comparator<HashMap<String, Object>>() { 
    @Override 
    public int compare(HashMap<String, Object> o1, HashMap<String, Object> o2) { 

     return ((Integer) o1.get("distance")).compareTo(
        (Integer) o2.get("distance")); 
    } 
}); 

完整的示例:

public static void main(String... args) { 

    List<HashMap<String, Object>> arrayListHashMap = 
     new ArrayList<HashMap<String, Object>>(); 

    { 
     HashMap<String, Object> hashMap = new HashMap<String, Object>(); 
     hashMap.put("key", "A key"); 
     hashMap.put("value", "B value"); 
     hashMap.put("distance", 2536); 

     arrayListHashMap.add(hashMap); 
    } 

    { 
     HashMap<String, Object> hashMap = new HashMap<String, Object>(); 
     hashMap.put("key", "B key"); 
     hashMap.put("value", "A value"); 
     hashMap.put("distance", 2539); 
     arrayListHashMap.add(hashMap); 
    } 

    Collections.sort(arrayListHashMap, 
     new Comparator<HashMap<String, Object>>() { 
     @Override 
     public int compare(
       HashMap<String, Object> o1, 
       HashMap<String, Object> o2) { 

      return ((Integer) o1.get("distance")).compareTo(
         (Integer) o2.get("distance")); 
     } 
    }); 


    System.out.println(arrayListHashMap); 
} 
+3

通過'i1-i2'比較整數時要小心。想想其中的一個是'Integer.MAX_VALUE'。 – Howard

+0

好點,更新! – dacwe