2011-09-14 22 views
0

中排序的散列表的鍵值存儲我很抱歉發佈了這個不清楚的問題。這是我第一次使用hashmap,因此我感到困惑。是否嘗試過在這裏更好的方式來說明這個問題 - 我有一個基於價值觀的排序HashMap的store key values of hashmap in string[]在字符串[]

。我想從有序映射中提取鍵並將它們存儲在一個String []數組中。鍵的順序(按值排序)很重要。 我用這個代碼進行排序值的HashMap - http://www.xinotes.org/notes/note/306/

要提取的關鍵陣列,我試圖

String[] keys = (String[])(hm.keySet().toArray(new String[hm.size()])) 

(這裏HM是HashMap中)

但是這種方法沒有工作。鍵字符串[]具有鍵,但不是按照我想要的排序順序。


更新: 我用LinkedHashMap的,並能排序的關鍵值存儲在陣列中。 Here是代碼的鏈接。

+3

你說你有一個「排序哈希表」 - 你究竟是什麼意思? –

+0

什麼都不起作用?訂單是否與您預期的不同? – amit

+0

抱歉,它的錯字..我已經整理了一個基於值 – Umang

回答

0

HashMap中使用key.hashValue()中的值進行排序。改用TreeMap。

+0

不。它沒有做任何類型的事情。 – EJP

+0

有無論如何從一個排序的哈希映射中提取鍵值並將它們存儲爲字符串[]? – Umang

+0

@Umang是的,你自己在你的問題中做了。 – EJP

0

我有一個基於價值觀的排序HashMap中。 我已經整理了一個基於值的散列圖

不,你沒有。 HashMap根本沒有排序。你可以將values()作爲一個Collection來使用,你可以按你喜歡的方式進行排序,但它不會對HashMap本身進行排序。

但是這種方法沒有工作。它以隨機的方式存儲密鑰。

它沒有被定義爲做任何不同的事情,特別是因爲你根本沒有對HashMap進行排序。

你需要澄清你在說什麼。如果你想對值進行排序,請執行上述操作。如果您想對鍵進行排序,請使用keys()而不是values()'進行上述操作。如果你想Map自己按鍵排序,使用TreeMap。如果你希望地圖本身按值排序,運氣不好,你不能。

+0

我知道一個hashmap不是自己排序的。我的意思是我創建了一個hashmap,然後對它進行排序。 – Umang

+0

你可以看到如何排序完成的鏈接問題 – Umang

+0

@Umang該鏈接並未展示對HashMap的排序。它顯示返回已排序列表的代碼。對HashMap沒有做任何事情。 – EJP

2

基於錯字,你的澄清所使用的HashMap,鍵檢索的順序不會與插入順序一致。爲此使用LinkedHashMap。這是使用你做外部排序,然後將排序的條目插入地圖。

如果要在他們被插入到地圖要排序的條目,請使用TreeMap的。您可以使用自定義比較器,也可以使關鍵對象實現Comparable界面。

+0

或「自然順序」的TreeMap。 – Thilo

+0

或帶有比較器的TreeMap,以獲得您喜歡的任何訂單。 – EJP

+0

@EJP:是的,在答案中已經提到(自定義比較器中的任何順序或可比較的自然順序)。也許我需要明確指出,自定義比較器通常用於非典型排序,並可以用於自然排序。 – Scorpion

0

試試這個:

public static void main(String[] args) { 
    Map<String, String> hm = new TreeMap<String, String>(); 
    hm.put("AAA", "typeAAA"); 
    hm.put("BBB", "typeBBB"); 
    hm.put("ABB", "TypeABB"); 
    String[] keys = hm.keySet().toArray(new String[0]); 
    for (String key : keys) { 
     System.out.println("key: " + key); 
    } 
} 

輸出將是:

key: AAA 
key: ABB 
key: BBB 
0

這似乎是你想HashMap的鍵的順序是一樣的排序鍵列表。這是根本不可能。密鑰由散列表算法確定;例如一個複雜的過程取決於密鑰的哈希值和插入和刪除的順序。

您將得到最接近的是創建一個LinkedHashMap,並通過按排序鍵的順序插入舊HashMap中的條目來填充它。如果您隨後遍歷LinkedHashMap的密鑰,您將按照它們插入的順序將它們重新取回。但這是一個重量級的解決方案,如果您隨後必須將更多條目添加到「已排序」的地圖,則會出現問題。使用TreeMap可能會更好。


我不想做出改變到HashMap中。我只想按照排序值的順序獲得一個數組。

在這種情況下,您只需將HashMap的鍵提取到數組中並對其進行排序即可。代碼已在其他答案中給出。另一方面,如果你想做一些事情,讓地圖的鍵總是以排序的順序出現(你似乎在其他評論中說),你可以改變地圖

+0

我不想對散列表進行更改。我只想按照排序值的順序獲得一個數組。 – Umang

+0

謝謝。將研究它。 – Umang