【问题标题】:Java - Iterating over a Map which contains a ListJava - 遍历包含列表的地图
【发布时间】:2012-04-21 23:32:00
【问题描述】:

第一次来,所以我希望这是有道理的!

我有一个 Map,其中包含一个字符串作为它的键,以及一个字符串列表作为它的值。我需要遍历地图中每个列表中包含的所有变量。

所以,首先我想获得有效的密钥:

Set<String> keys = theMap.keySet();

这会返回一个包含我所有密钥的集合。太好了:)

这是我卡住的地方 - 网络上的大多数信息似乎都假设我希望从 Key 返回的值是一个简单的字符串或整数,而不是另一个 Set,或者在这种情况下是一个列表。我尝试了theMap.values(),但没有成功,我尝试了 forloop / for:eachloop,但这些都没有成功。

谢谢大家!

【问题讨论】:

    标签: java list map set


    【解决方案1】:
    for(List<String> valueList : map.values()) {
      for(String value : valueList) {
        ...
      }
    }
    

    这确实是“正常”的做法。或者,如果您也需要密钥...

    for(Map.Entry<String, List<String>> entry : map.entrySet()) {
      String key = entry.getKey();
      for (String value : entry.getValue()) {
        ...
      }
    }
    

    也就是说,如果您可以选择,您可能会对Guava's ListMultimap 感兴趣,它与Map&lt;K, List&lt;V&gt;&gt; 很像,但具有更多功能——包括作用完全相同的Collection&lt;V&gt; values()就像您要求的那样,将多图中的所有值“展平”到一个集合中。 (披露:我为 Guava 做出了贡献。)

    【讨论】:

    • Spot on :) 我已经研究了这么多变体 - 结果我错了是我如何使用第二个 foreach 循环返回的值。非常感谢!
    【解决方案2】:

    你需要一个Map&lt;String, List&lt;String&gt;&gt;

    左侧String 是键,右侧List&lt;String&gt; 是值,在这种情况下是ListStrings

    【讨论】:

      【解决方案3】:

      我建议迭代 Map.entrySet(),因为它更快(您同时拥有键和值,只需一步即可找到)。

      Map<String, List<String>> m = Collections.singletonMap(
          "list1", Arrays.asList("s1", "s2", "s3"));
      
      for (Map.Entry<String, List<String>> me : m.entrySet()) {
        String key = me.getKey();
        List<String> valueList = me.getValue();
        System.out.println("Key: " + key);
        System.out.print("Values: ");
        for (String s : valueList) {
          System.out.print(s + " ");
        }
      }
      

      或同样使用 Java 8 API(Lambda 函数):

      m.entrySet().forEach(me -> {
          System.out.println("Key: " + me.getKey());
          System.out.print("Values: ");
          me.getValue().forEach(s -> System.out.print(s + " "));
      });
      

      或者用一点点 Java Stream API 映射硬核和方法参考:-)

      m.entrySet().stream().map(me -> {
          return "Key: " + me.getKey() + "\n"
              + "Values: " + me.getValue().stream()
                  .collect(Collectors.joining(" "));
          })
          .forEach(System.out::print);
      

      输出如预期的那样:

      键:list1 值:s1 s2 s3

      【讨论】:

        猜你喜欢
        • 2020-01-25
        • 1970-01-01
        • 2022-01-13
        • 2013-07-26
        • 2020-05-18
        • 1970-01-01
        • 2015-12-13
        • 2022-01-23
        相关资源
        最近更新 更多