【问题标题】:Get Key value from iterator从迭代器获取键值
【发布时间】:2012-07-25 08:35:27
【问题描述】:

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

我怎样才能得到这些?

【问题讨论】:

  • 除了按照下面的答案使用entrySet()外,您还可以使用keySet()来获取密钥。

标签: java hashmap


【解决方案1】:

您无法从values().iterator() 获取密钥。

您需要使用entrySet().iterator()。这将返回您可以调用 getKey()getValue()Map.Entry&lt;K,V&gt; 对象。

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

  // do stuff
}

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

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

    • 我不鼓励对键进行迭代并调用get(),因为它几乎肯定会比对键集进行迭代具有更差的性能。
    • 好的。我认为代码稍微干净一些,但这也许是一个品味问题。
    【解决方案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());
        }
    }
    

    【讨论】:

      【解决方案4】:

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

      您可以通过以下方式获取密钥。

      Iterator i= subitems.entrySet().iterator();
      
      while(i.hasNext()){
      
      String key= i.next().getkey();
      }
      

      【讨论】:

        【解决方案5】:

        您可以在第一个 HashMap 上使用 entrySet().iterator() 迭代条目,或者获取键并对其进行迭代:而不是 subitems.values().iterator() 使用 subitems.keys().iterator() 并使用下一个键来获取内部哈希图。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2020-10-11
          • 2012-10-17
          • 1970-01-01
          • 1970-01-01
          • 2011-07-03
          相关资源
          最近更新 更多