2011-03-20 72 views
11

我需要調用一個外部API與一個ArrayList的HashMaps每個持有幾個預定義的鍵值對。例如:HashMap的ArrayList如何對每個鍵持有幾個鍵值對進行排序?

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

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

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

現在我需要對「value」鍵的內容進行排序。這種排序會導致「key = B key/value = A」條目作爲arrayListHashMap中的第一個條目。

任何幫助,高度讚賞。

HJW

回答

31

你需要實現一個Comparator<HashMap<String, String>>或者更一般Comparator<Map<String, String>>剛剛取得與value鍵assocated的值,然後使用Collections.sort。示例代碼(與泛化爲要排序上的任何鍵):

class MapComparator implements Comparator<Map<String, String>> 
{ 
    private final String key; 

    public MapComparator(String key) 
    { 
     this.key = key; 
    } 

    public int compare(Map<String, String> first, 
         Map<String, String> second) 
    { 
     // TODO: Null checking, both for maps and values 
     String firstValue = first.get(key); 
     String secondValue = second.get(key); 
     return firstValue.compareTo(secondValue); 
    } 
} 

... 
Collections.sort(arrayListHashMap, new MapComparator("value")); 
+0

謝謝非常適合你的快速回答。 – 2011-03-20 16:49:45

+0

你好,如果我想對一些自定義標準進行排序會怎樣?就像我有一個值說TEST一樣,我希望對列表進行排序,使TEST的所有值都是第一位,然後是所有其他值。所以基本上如果我有大小列表讓我說10,並且如果它包含測試值2次在位置5和8,然後我希望他們兩個在上面。其他值將在此之後..可以請告訴我如何去做.. – Scorpion 2012-11-07 07:38:00

+0

@Scorpion:然後你寫一個比較檢查測試,並始終把它比任何其他值更早。哪一點你覺得困難? (這可能是最好的一個新的問題...) – 2012-11-07 07:46:48

0

(這不是一個答案,問的問題 - 喬恩這樣做已經 - ,但註釋字段是太小了這一點。)

您的數據結構看起來像您誤解了地圖的鍵值結構(在您的示例中爲哈希貼圖)。

一個Map可以包含任意數量的鍵,並且對於每個鍵也是一個值。一對密鑰和值由Map.Entry給出(可以通過地圖的entrySet()方法獲得)。如果你想按鍵排序,只需使用SortedMap(如TreeMap)而不是通常的HashMap。

你被一個HashMap每個模擬的每個條目,然後把它們放在一個ArrayList的...: -/

在這裏我會在你的例子做了:

Map<String, String> map = new TreeMap<String, String>(); 
map.put("B key", "B value"); 
map.put("A key", "B value"); 

System.out.println(map); // already sorted 
+1

感謝您的回答。我需要提供外部API - 這個想法不是我的。我所理解的是,他們模擬了數據庫查詢結果之類的東西。 ArrayList是查詢結果,每個HashMap都是一條記錄,每個條目都是一個字段名,它是值。 「關鍵」將是一個領域,而「價值」則是另一個領域。似乎我應該在示例中爲這兩個條目使用了不同的名稱。只需要「field1」和「field2」而不是「key」和「value」。對困惑感到抱歉。 – 2011-03-20 16:47:42

+0

外部API實際上應該使用javabeans列表。 – BalusC 2011-03-20 16:49:22

相關問題