2015-11-06 45 views
1

我想要一個值的字典。鑰匙都是字符串。每個鍵與某種類型的字符串列表相對應。如何爲每個密鑰創建一個字符串列表並相應更新?我會解釋:如何將這些數據存儲在Java中?

我有一個循環,讀取一個單詞列表的行。然後將單詞轉換爲字符串代碼並設置爲字典中的鍵。這是一個字符串代碼/字關係的例子。

123,[中]

456,[狗]

328,[缺陷] ...

然而,我的程序不斷通過單詞列表循環,最終會碰上與「the」代碼相同的單詞,但也許是不同的單詞,可以說「貓」。所以我想在列表中的樣子:

123,[中,貓]

456,[狗] ...

我如何得到它讓每一個鍵一個ArrayList是我可以隨時添加到需要的時候?我的最終目標是能夠打印列表中的單詞列表中的被調用代碼(.get())

+0

你能提供一些你現有的代碼嗎? – rhgb

回答

1

聽起來好像你想要Multimapthe Guava library

你也可以去使用Map<Integer, List<String>>的路線,但是你需要手動處理列表爲空的情況(可能只是在這種情況下分配一個新列表)。

3

您可以製作一個HashMap。在你的情況下, HashMap<Integer, ArrayList<String>>工作正常。

+0

我知道,但如果我做列表 arrayList = new ArrayList (); 那麼當我回到我的循環時,我的數據就不會消失了嗎? –

+0

你能給我一個更全面的代碼圖片嗎?我不認爲這是一個問題,但是如果沒有更大的代碼片段很難說。 –

+0

我現在要試驗這個。我仍然處於這個項目的規劃階段:/謝謝。我會很快回復你,希望哈哈! –

1

您可以使用每個ID鏈接到字符串列表一個HashMap:

Map<String, List<String>> dictionary = new HashMap<String,List<String>>(); 

現在讓我們假設你讀兩個字符串:idword。要將它們添加到字典中,您可以首先驗證您的ID是否已被讀取(使用方法containsKey()) - 在這種情況下,您只需將該單詞追加到與該ID相對應的列表中;或者,如果不是這種情況,您創建一個新的列表與這個詞:

//If the list already exists... 
if(dictionary.containsKey(id)) { 
    List<String> appended = dictionary.get(id); 
    appended.add(word); //We add a new word to our current list 
    dictionary.remove(id); //We update the map by first removing the old list 
    dictionary.put(id, appended); //and then appending the new one 
} else { 
//Otherwise we create a new list for that id 
    List<String> newList = new ArrayList<String>(); 
    newList.add(word); 
    dictionary.put(id, newList); 
} 

然後,每當你想找回您的字符串列表一定的id,你可以簡單地使用dictionary.get(ID);

你可以找到包含HashMap的Java documentation

+0

謝謝。我現在要解決這個問題。 –

+0

更新:我得到一個錯誤,它找不到詞典的.add方法..? –

+0

我現在明白這一點,正是我想要的,但它仍然沒有編譯。字典的未知符號.add,我甚至有java.util。*導入。我正在通過終端進行編譯。 –

0

我以爲你不想在你的名單,所以我用,而不是設置重複的更多信息。

Map<String,Set<String>> mapToSet = new HashMap<>(); 
List<String []>keyvals = Arrays.asList(new String[][]{{"123","the"},{"123","cat"}}); 
for(String kv[] : keyvals) { 
    Set<String> s = mapToSet.get(kv[0]); 
    if(null == s) { 
     s = new HashSet<String>(); 
    } 
    s.add(kv[1]); 
    mapToSet.put(kv[0], s); 
} 
+0

這不是動態的。我需要使用數組列表,因爲它是在一個大循環中進行的。 –

+0

只需用數組列表替換數組。 – WillShackleford

2

就像它已經說過,一個MultiMap似乎是你需要的。已經提出了Guava,這是一個不錯的選擇。你也可以使用commons-collections也有。

commons-collections提供的文檔:

MultiValuedMap<K, String> map = new MultiValuedHashMap<K, String>(); 
map.put(key, "A"); 
map.put(key, "B"); 
map.put(key, "C"); 
Collection<String> coll = map.get(key); // returns ["A", "B", "C"] 

你總是可以實現自己的Multimap之,如果你不想使用外部庫。使用HashMap<String,List<String>>來存儲你的值,並用你自己的put,get和其他你認爲合適的方法來包裝它。

相關問題