Java 从迭代器获取键值

Java 从迭代器获取键值,java,hashmap,Java,Hashmap,我有一个HashMap,其中包含另一个HashMap。我想迭代第一个HashMap并使用其中的键值。然后,当我迭代第一个HashMap时,我想开始一个内部循环,迭代第二个HashMap,得到所有的值 到目前为止,我遇到的问题是,我不知道如何从迭代器中获取密钥 HashMap<String, HashMap<Integer, String>> subitems = myHashMap.get("mainitem1"); Collection c = subitems.va

我有一个HashMap,其中包含另一个HashMap。我想迭代第一个HashMap并使用其中的键值。然后,当我迭代第一个HashMap时,我想开始一个内部循环,迭代第二个HashMap,得到所有的值

到目前为止,我遇到的问题是,我不知道如何从迭代器中获取密钥

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();
}
然后,在while循环
productitem
中包含“子项”。但我无法找到从何处获取键值“Item1”和“Item2”


如何获取这些信息?

在地图中,不能从值到键。(可能有多个键映射到同一个值!)


您可以通过使用
子项来迭代映射项。
.iterator()
,或者您可以迭代键,并在每次迭代中通过
子项检索关联值。获取(键)
您无法从
值().iterator()获取键

你需要使用。这将返回您可以调用和调用的对象

for(Map.Entry:subitems.keySet()){
整数key=entry.getKey();
字符串值=entry.getValue();
//做事
}

我还想补充一点,拥有深度嵌套的映射列表通常是一种迹象,表明您确实希望编写自定义类来保存数据尤其是当地图具有要使用的预定义键且列表中值的解释取决于列表中的位置时!我称之为代码气味。

您可以在第一个
HashMap
上使用
entrySet().iterator()
迭代条目,或者获取键并迭代它们:而不是
子项。值().iterator()
使用
子项。键().iterator()
并使用next键获取内部hashmap。

您可以这样做(使用迭代器):

Set c=subitems.entrySet();
迭代器迭代器=c.迭代器();
while(iterator.hasNext())
{
Entry=iterator.next();
System.out.println(“key:+entry.getKey());
HashMap innerMap=entry.getValue();
if(innerMap==null){
继续;
}
迭代器innerIterator=innerMap.entrySet().Iterator();
while(innerIterator.hasNext()){
Entry innerEntry=innerIterator.next();
System.out.println(“键:+innerEntry.getKey()+”值:+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());
    }
}
for(条目:subitems.entrySet())
{
System.out.println(“key:+entry.getKey());
HashMap innerMap=entry.getValue();
if(innerMap==null){
继续;
}
对于(条目innerEntry:innerMap.entrySet())
System.out.println(“键:+innerEntry.getKey()+”值:+innerEntry.getValue());
}
}

java集合提供了
入口集的功能。这是包含单个键和值作为其属性的对象列表。您可以从列表中选择迭代器

您可以按如下方式获取密钥

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

while(i.hasNext()){

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

除了根据下面的答案使用
entrySet()
之外,您还可以使用
keySet()
只获取密钥。我不建议迭代密钥并调用
get()
,因为它几乎肯定比迭代密钥集的性能更差。Ok。我认为代码稍微干净了一点,但这可能是品味的问题。
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());
    }
}
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());
    }
}
Iterator i= subitems.entrySet().iterator();

while(i.hasNext()){

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