3

我有一个 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”。

我怎样才能得到那些?

4

5 回答 5

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
}

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

于 2012-07-25T08:36:55.333 回答
3

您不能在地图中从值转到键。(可能有多个键映射到相同的值!)

您可以使用 迭代映射条目,也可以迭代键,并在每次迭代中通过 检索关联的值。subitems.entrySet().iterator()subitems.get(key)

于 2012-07-25T08:36:24.807 回答
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());
    }
}
于 2012-07-25T08:40:26.283 回答
2

java Collections 提供了EntrySet. 这是一个包含单个键和值作为其属性的对象列表。您可以从此列表中取出一个迭代器。

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

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

while(i.hasNext()){

String key= i.next().getkey();
}
于 2012-07-25T08:40:28.750 回答
1

entrySet().iterator()您可以使用第一个HashMap或获取键并迭代它们来迭代条目:而不是subitems.values().iterator()使用subitems.keys().iterator()并使用下一个键来获取内部哈希图。

于 2012-07-25T08:37:37.037 回答