2012-07-25 80 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(); 
}