我有一个HashMap,它包含另一个HashMap。我想迭代第一个HashMap并使用其中的Key值。然后,当我遍历第一个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();
}
我从subitems
获得的数据是:
{Item1{0=sub1, 1=sub2}, Item2{0=sub3, 1=sub4}}
然后,在while循环productitem
中包含'子项'。但我无法找到从哪里获得键值'Item1'和'Item2'。
我怎样才能得到那些?
答案 0 :(得分: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"。
答案 1 :(得分:3)
您无法在地图中从值变为键。 (可能有几个键映射到相同的值!)
您可以使用subitems.
entrySet()
.iterator()
迭代地图条目,也可以迭代密钥,并在每次迭代中通过subitems.get(key)
检索相关值
答案 2 :(得分: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());
}
}
答案 3 :(得分:2)
java Collections提供EntrySet
的功能。这是包含单个键和值作为其属性的对象列表。你可以从这个列表中取出一个迭代器。
您可以按如下方式获取密钥。
Iterator i= subitems.entrySet().iterator();
while(i.hasNext()){
String key= i.next().getkey();
}
答案 4 :(得分:1)
您可以在第一个entrySet().iterator()
上使用HashMap
迭代条目,或者获取密钥并对其进行迭代:而不是subitems.values().iterator()
使用subitems.keys().iterator()
并使用下一个密钥来获取内部hashmap。