2015-06-16 52 views
-2

我是Java新手,我有一個HashMap<String, List<String>>。當我給出一個值時,我想從Map中搜索一個鍵。在ArrayList中查找映射中的鍵值

該地圖將州的數據存儲爲關鍵字,並將其城市作爲列表存儲。所以假設沒有重複的鍵或值。

一些以前的答案指出了很多方面的解決方案:許多和一個:關鍵值在地圖中的一個關係,但我不明白如何檢查List中的值。

我是否遍歷整個地圖併爲每個鍵獲取列表並在列表中搜索?或者有沒有其他的方式來做到這一點?

請建議一些方法。謝謝!

+1

查看Apache Common Collection庫。他們有一個「雙向映射」(BidiMap) - 一個雙向映射和一個「MultiValueMap」 - 裝飾另一個映射,允許它有一個以上的值。這些和其他可能有用或興趣。 –

+0

@BrettWalker謝謝你的迴應,我們不能使用java api的相同嗎?我想避免使用任何額外的庫。 – HitchHiker

+0

我可以理解,如果可以避免的話,不想包含額外的庫。但是,我瘋狂的兩個建議並不是微不足道的,你所要求的是在Java Collections中找不到的。 –

回答

1

你應該製作倒地圖(城市 - >州地圖)。

public Map<String, String> invertedMap(Map<String, List<String>> map) { 
    Map<String, String> inverted = new HashMap<>(); 
    for (Entry<String, List<String>> e : map.entrySet()) 
     for (String city : e.getValue()) 
      inverted.put(city, e.getKey() /* state */); 
    return inverted; 
} 
+0

謝謝你的解決方案!我現在正在嘗試它,我希望這會使任務更容易:) – HitchHiker

+0

@vaishnavee如果兩個州有相同的城市名稱,倒映圖必須是Map >。小心! – saka1029

+0

是的,這將主要是這種情況,我將不得不爲它處理一些通用數據,但在我的應用程序中沒有必要,因爲肯定沒有重複:)並且解決方案運行順利!謝謝 – HitchHiker

0

地圖旨在允許通過使用密鑰快速訪問值。反過來,要求你遍歷所有值並尋找它。此外,您需要知道,可以爲多個鍵存儲相同(或相等)的值。

爲了有效地搜索給定城市名稱的所有狀態,您可以使用一個反向地圖,其中城市名稱是關鍵字,值是州的集合(假設有幾個城市各自處於不同的狀態 - 例如在美國似乎有多個Springfield)。

一個簡單的方法來創建這樣一個倒轉的地圖將使用番石榴的Multimap的初始地圖(州 - >城市),然後使用Multimaps.invertFrom(intialMap);

編輯:在參考佈雷特·沃克的評論,阿帕奇百科全書集合BidiMap似乎遵循了類似的做法,即AbstractDualBidiMap實現內部使用兩張地圖,如上所述。

+0

我覺得這個問題可能有助於OP:http://stackoverflow.com/questions/1383797/java-hashmap-how-to-get-key -from-value – Adam

+0

@Thomas感謝您的迴應,我已經說過,我正在處理的數據中沒有重複鍵值。是不是隻能使用Java Collection API? – HitchHiker

+0

@WhyCry是的,這是我所指的相同的答案,但它沒有解釋清單值部分 – HitchHiker

0

我會使用Apache Common Collection庫中的BidiMap作爲起點。

對於List<String>部分,我會考慮使用MultiValueMap,因爲它裝飾另一個地圖,允許它爲一個鍵有多個值。我已經使用BidiMap位而不是MultiValueMap。我在想這兩者都會有用。