2012-07-25 65 views
3

我有一個HashMap,它包含另一個HashMap。我想迭代第一個HashMap並使用它的Key值。然後,當我迭代第一個HashMap時,我想要啓動一個迭代第二個HashMap的內部循環,獲取所有的值。從迭代器獲取關鍵值

我到目前爲止的問題是,我無法弄清楚如何從Iterator獲取密鑰。

HashMap<String, HashMap<Integer, String>> subitems = myHashMap.get("mainitem1"); 

Collection c = subitems.values(); 
Iterator itr = c.iterator(); 

while(itr.hasNext()) 
{ 
    // Get key somehow? itr.getKey() ??? 

    // contains the sub items 
    HashMap productitem = (HashMap)itr.next(); 
} 

,我從subitems得到的數據是這樣的:

{Item1{0=sub1, 1=sub2}, Item2{0=sub3, 1=sub4}} 

然後,在while循環productitem包含 '子項'。但我無法找到我可以從哪裏獲得關鍵值'Item1'和'Item2'。

我怎樣才能得到那些?

+0

除了根據下面的答案使用'entrySet()',還可以使用'keySet()'來獲得鍵。 – bdares 2012-07-25 08:38:13

回答

9

您無法從values().iterator()獲得密鑰。您需要使用entrySet().iterator()。這將返回Map.Entry<K,V>對象,您可以在其中調用getKey()getValue()

for (Map.Entry<Integer,Key> entry : subitems.keySet()) { 
    Integer key = entry.getKey(); 
    String value = entry.getValue(); 

    // do stuff 
} 

我還想補充一點,有地圖列表的深度嵌套的地圖通常是一個跡象,表明你真的想編寫自定義的類來保存數據。 特別是當地圖有預定義的鍵將被使用和解釋列表中的值取決於列表中的位置!我將此代碼稱爲"object denial"

3

你不能從價值去鍵入地圖。 (可能有多個鍵映射到相同的值!)

您可以遍歷映射條目雖然使用subitems.entrySet().iterator(),或者你可以遍歷鍵,並在每次迭代中檢索通過subitems.get(key)關聯的值。

+0

我不鼓勵迭代鍵並調用'get()',因爲它肯定會比遍歷鍵集的性能差。 – 2012-07-25 08:38:21

+0

好的。我認爲代碼雖然稍微清晰一點,但這也許是一個口味問題。 – aioobe 2012-07-25 08:39:20

1

您可以在第一HashMap使用entrySet().iterator()項遍歷或拿到鑰匙,並在它們之間迭代:與其subitems.values().iterator()使用subitems.keys().iterator()和使用NEXT鍵獲得內部HashMap中。

3

你可以做這樣的事情(使用迭代器):

Set<Entry<String, HashMap<Integer, String>>> c = subitems.entrySet(); 
Iterator<Entry<String, HashMap<Integer, String>>> iterator = c.iterator(); 

while(iterator.hasNext()) 
{ 
    Entry<String, HashMap<Integer, String>> entry = iterator.next(); 
    System.out.println("key:" + entry.getKey()); 
    HashMap<Integer, String> innerMap = entry.getValue(); 
    if (innerMap == null) { 
     continue; 
    } 
    Iterator<Entry<Integer, String>> innerIterator = innerMap.entrySet().iterator(); 
    while (innerIterator.hasNext()) { 
     Entry<Integer, String> innerEntry = innerIterator.next(); 
     System.out.println("key:" + innerEntry.getKey() + " value: " + innerEntry.getValue()); 
    } 
} 

或像這樣使用的foreach結構:

for (Entry<String, HashMap<Integer,String>> entry : subitems.entrySet()) 
{ 
    System.out.println("key:" + entry.getKey()); 
    HashMap<Integer, String> innerMap = entry.getValue(); 
    if (innerMap == null) { 
     continue; 
    } 
    for (Entry<Integer, String> innerEntry : innerMap.entrySet()) 
     System.out.println("key:" + innerEntry.getKey() + " value: " + innerEntry.getValue()); 
    } 
} 
2

Java集合提供的EntrySet設施。這是包含各個鍵和值作爲其屬性的對象列表。你可以從這個列表中取出一個迭代器。

您可以獲得如下密鑰。

Iterator i= subitems.entrySet().iterator(); 

while(i.hasNext()){ 

String key= i.next().getkey(); 
}