2010-01-03 60 views
-2

我有散列表,它的鍵就像「文件夾/1.txt,文件夾/2.txt,文件夾/ 3.txt」,值有這些文本文件的數據。如何排序hashmap?

現在我被卡住了。我想對這個列表進行排序。不過,這並不讓我來做:( 這裏是我的HashMap的數據類型:

HashMap<String, ArrayList<String>> 

以下功能的工作不錯,但它是ArrayList的不是HashMap的

Collections.sort(values, Collections.reverseOrder()); 

我也試過MapTree但它也沒有工作,或者可能是我無法使它工作。我用 以下步驟進行排序與​​maptree

HashMap testMap = new HashMap(); 
Map sortedMap = new TreeMap(testMap); 

任何其他方式做到這一點的代碼?

我有一個疑問,因爲我的鑰匙是(文件夾/1.txt,文件夾/2.txt)可能是這個原因嗎?

+0

你想排序地圖字符串,還是你想排序字符串的每個值列表? – 2010-01-03 04:12:02

+5

-1 - 這個問題是無法理解的。所有嘗試的答案都是猜測問題的真正含義。 – 2010-01-03 04:22:45

+0

你是對的斯蒂芬,我們都在猜測! – akuhn 2010-01-03 04:23:44

回答

10

我想你想要的鍵列表排序。

如果你的HashMap被稱爲h,那就試試這個:

SortedSet<String> sortedKeys = new TreeSet<String>(h.keySet()); 
+0

謝謝,它的工作! 對不起,如果我的問題讓你的傢伙猜測! – user238384 2010-01-03 04:46:51

+3

(-1)你不能新的SortedSet(),它是一個接口。應該是像sortedKeys = new TreeSet (h.keySet()); – RealHowTo 2010-01-03 05:51:32

+0

RealHowTo - 謝謝。你是對的。我已經解決了我的答案。 – 2010-01-03 09:02:51

2

使用TreeMap,並實現文件夾路徑的比較器接口。

比較器應根據您想要的規則比較兩個鍵,並將該比較器傳遞給TreeMap的構造函數。如果按純字母順序排序,那麼你可以跳過這一步。如果你想對路徑做一些特殊的事情,那麼你需要定義比較器中的內容。

+1

樹圖排序*鍵*不是元素! – akuhn 2010-01-03 04:07:21

+0

你爲什麼要排序值?這沒有任何意義。 – MeBigFatGuy 2010-01-03 04:10:51

+0

你先寫了「元素」。現在聽起來沒問題,但是不會讓我拿走downvote,直到你再次編輯! – akuhn 2010-01-03 04:17:55

5

爲什麼不只是這樣做呢?

Map<String, ValueObject> testMap = new TreeMap<String, ValueObject>(); 

其中ValueObject是您用於值的任何類。

編輯:這是基於一些假設 - 等待獲得更多的信息,看看OP真正需要什麼。

+1

我的確看過這篇文章 - 他沒有明確說出他是否想根據鍵或值進行排序。他也沒有說如果鍵是字符串或文件。所以我假設他想要基於String鍵進行排序,這會自動使用TreeMap,而不是HashMap。 – 2010-01-03 04:20:20

0

我的第一個猜測是使用使用File對象而不是String對象作爲鍵。但後來我注意到,你說你的鑰匙是"folder/1.txt,folder/2.txt,folder/3.txt",你的值是Collection<Strings>。如果是這樣的話,也許你的解決方案應該是

map.put("folder/1.txt", ...); 
map.put("folder/2.txt", ...); 
map.put("folder/3.txt", ...); 

而不是

map.put("folder/1.txt,folder/2.txt,folder/3.txt", new ArrayList(...)); 

獲取與TreeMap整理你嘗試過的單個文件。

+0

他說他的鑰匙是字符串... – 2010-01-03 04:10:13

+0

但他似乎使用逗號分隔文件名作爲鍵,所以我編輯我的帖子有另一個猜測。請刪除downvote。 – akuhn 2010-01-03 04:22:22

+0

當然,我們會看看他是否澄清過他到底在做什麼:) – 2010-01-03 04:26:51

0

我相信HashMaps不能保證任何順序,當你遍歷按鍵。迭代順序取決於桶和衝突。

您可能希望將這些值放入其他集合中,然後對它們進行排序。

+0

HashMaps不保證在按鍵中排序。根據http://java.sun.com/javase/6/docs/api/java/util/HashMap.html「這個類不能保證地圖的順序;特別是,它不能保證隨着時間的推移訂單將保持不變。「 – 2010-01-03 04:13:47

+0

對於HashMap本身是true,但可以看看LinkedHashMap(它擴展了HashMap)。它保證了鍵被插入的順序。 – 2010-01-03 13:27:27

0

有時候我用LinkedHashMap中,調用鍵設置(),它可以讓你回到一個排序方式項,您通過添加到地圖時放()。