2014-01-10 33 views
5
HashMap<String,Integer> map = new HashMap<String,Integer>(); 
map.put("a", 4); 
map.put("c", 6); 
map.put("b", 2); 

所需的輸出(HashMap的)一個HashMap:如何排序整數值

c : 6 
a : 4 
b : 2 

我一直沒能找到有關價值遞減的順序什麼。
這是如何實現的? (額外的類別不是首選)

+1

你不能。但是你可以排序的*條目*(一次在一個列表或者其他有序集合)的值:開始,'列表條目=新的ArrayList <進入<字符串,整數>>(hash.getEntries())';然後排序。 – user2864740

+0

@RC這是不一樣的問題.. – GameDevGuru

+1

(雖然我認爲這是一個「複製」,在其他問題接受的答案是相當可怕的 - 讀了所有的答覆我也建議使用[陣]列表。 VS LinkedHashMap的作爲輸出集合) – user2864740

回答

18

試試這個:

HashMap<String, Integer> map = new HashMap<String, Integer>(); 
map.put("a", 4); 
map.put("c", 6); 
map.put("b", 2); 
Object[] a = map.entrySet().toArray(); 
Arrays.sort(a, new Comparator() { 
    public int compare(Object o1, Object o2) { 
     return ((Map.Entry<String, Integer>) o2).getValue() 
        .compareTo(((Map.Entry<String, Integer>) o1).getValue()); 
    } 
}); 
for (Object e : a) { 
    System.out.println(((Map.Entry<String, Integer>) e).getKey() + " : " 
      + ((Map.Entry<String, Integer>) e).getValue()); 
} 

輸出:

c : 6 
a : 4 
b : 2 
+0

這將鍵,值對作爲單個對象放入數組中,我需要能夠在排序後單獨檢索鍵,值 – GameDevGuru

+0

它將Map.Entry分開提取鍵和值,參見upate –

1

Hash元素的特點之一是他們在做諸如添加,刪除等操作時的特殊速度,這正是因爲他們使用哈希算法,這意味着他們不保留我們知道的元素的順序或後代。這意味着與Hash數據結構,你不會達到你想要的。

+2

這將是一個非常好的建議,但請不要回答這個問題。 – Ashish

+0

而不是說這是不可能的,那麼建議如何將它作爲一個ArrayList先投射出來。 – GameDevGuru

+0

@ user2864740 List intList = new ArrayList (map); ,然後與列表一起工作。或者是這個效果。 – GameDevGuru

4

不能明確地排序的HashMap,但可以在條目進行排序。也許是這樣的幫助:

// not yet sorted 
List<Integer> intList = new ArrayList<Integer>(map.values()); 

Collections.sort(intList, new Comparator<Integer>() { 

    public int compare(Integer o1, Integer o2) { 
     // for descending order 
     return o2 - o1; 
    } 
}); 
+0

我相信OP想要共同擁有關鍵和價值,然而在結果被使用。 – user2864740

+1

這將鍵與價值分離,沒有期望的結果。 – GameDevGuru

+0

這是真的,我想他是打印出來的東西,所以他只需要做一個方法,調用map.getKey(value)並返回一個字符串...或任何他需要的東西。 –