2012-12-05 58 views
1

我有一個HashMap<Character, Integer>,我想按照整數的升序將值放入PriorityQueue。我在想辦法做到這一點時遇到麻煩。我有一個Node類可以容納的值,所以:PriorityQueue<Node>在HashMap中排序值

+1

可能重複http://stackoverflow.com/questions/109383/how-to-sort-a-mapkey-value-on-the-values-in-java – Abubakkar

+2

改爲使用'SortedMap'(例如'TreeMap'):http://docs.oracle.com/javase/6/docs/api/java/util/SortedMap.html – Yuushi

+0

我在發佈之前查看了該線程,但我並沒有試圖對地圖進行排序(由於hashmaps的性質,這很複雜,幾乎不可能),而是以有序的方式選擇它們。 –

回答

1

我不會用在這種情況下Map ....

寫自己的Pair/Node類,用於保存您的CharacterInteger,使這個類實現Comparable

您可以在Comparablehere中閱讀。

在您的節點類,你將不得不實施compareTo方法,財產以後這樣的:

public int compareTo(Node o) { 
    return this.idd - o.idd ; 
} 

其中id是可變的牽着你的整數。

這樣你可以把它們放在一個SortedSet就像你在你的問題提

+0

好了,實現了可比的並且重寫了compareTO,所以它返回-1表示小於,0表示相同的數字,1表示大於 –

+1

好吧,現在只需將節點放入一個已排序的集合中,看看發生了什麼。 – Frank

+0

雅我決定把他們全部在優先隊列,然後排序。Collections.sort()似乎並沒有與我的優先級隊列雖然:( 好吧,我重新閱讀優先隊列的文檔,看起來像它自動命令本身 –

0

代碼示例TreeSetPriorityQueue

HashMap<Character, Integer> h = new HashMap<Character, Integer>(); 
h.put('z',30); 
h.put('e',10); 
h.put('b',20); 
h.put('c',20); 
List<Map.Entry> a = new ArrayList<Map.Entry>(h.entrySet()); 
Collections.sort(a, 
       new Comparator() { 
        public int compare(Object o1, Object o2) { 
         Map.Entry e1 = (Map.Entry) o1; 
         Map.Entry e2 = (Map.Entry) o2; 
         return ((Comparable) e1.getValue()).compareTo(e2.getValue()); 
        } 
       }); 

for (Map.Entry e : a) { 
     System.out.println(e.getKey() + " " + e.getValue()); 
} 

輸出(由整數值排序所要求的OP):

e 10 
b 20 
c 20 
z 30