代码之家  ›  专栏  ›  技术社区  ›  w00

从迭代器获取键值

  •  3
  • w00  · 技术社区  · 14 年前

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

    我怎样才能拿到这些?

    5 回复  |  直到 14 年前
        1
  •  9
  •   Community Mohan Dere    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" 。

        2
  •  3
  •   aioobe    14 年前

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

    您可以通过使用来迭代映射条目 subitems. entrySet() .iterator() ,或者您可以对键进行迭代,并在每次迭代中通过 subitems.get(key) 。

        3
  •  3
  •   Francisco Spaeth    14 年前

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

    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
  •  2
  •   Ahmad    14 年前

    java集合提供了 EntrySet 。这是包含单个键和值作为其属性的对象列表。你可以从这个列表中去掉一个迭代器。

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

    Iterator i= subitems.entrySet().iterator();
    
    while(i.hasNext()){
    
    String key= i.next().getkey();
    }
    
        5
  •  1
  •   Aleks G    14 年前

    您可以使用 entrySet().iterator() 关于第一个 HashMap 或者获取密钥并对其进行迭代:而不是 subitems.values().iterator() 使用 subitems.keys().iterator() 并使用next键获取内部哈希图。