有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java从迭代器获取键值

我有一个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();
}

我从subitems获得的数据如下:

{Item1{0=sub1, 1=sub2}, Item2{0=sub3, 1=sub4}}

然后,在while循环中productitem包含“子项”。但我无法找到从何处获取键值“Item1”和“Item2”

我怎样才能得到这些


共 (5) 个答案

  1. # 1 楼答案

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

  2. # 2 楼答案

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

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

    Iterator i= subitems.entrySet().iterator();
    
    while(i.hasNext()){
    
    String key= i.next().getkey();
    }
    
  3. # 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. # 4 楼答案

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

    您需要使用^{}。它将返回^{}个对象,您可以在这些对象上调用^{}^{}

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

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

  5. # 5 楼答案

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

    您可以通过使用subitems.^{}{}来迭代映射项,也可以迭代键,并在每次迭代中通过subitems.get(key)检索关联值