【问题标题】:Iterating over List in a Map遍历地图中的列表
【发布时间】:2012-06-05 08:05:16
【问题描述】:

迭代“非规范化”集合映射的最佳方法是什么?

例如,我有以下地图:

Map<String, List<String>> relations;

为了遍历每个键 -> 每个值,我执行以下操作:

for (Entry<String,List<String>> e : relations.entries()) {
   for (String s : e.getValue()) {
       System.out.println(e.getKey() + " - " + s);
   }
}

有没有一种优雅的方法可以用一些装饰器来解决它?

我希望找到类似的东西:

for(Entry e : Collections.getDenormalizeEntriesFromMapOfCollection(myMap)) {
   System.out.println(e.getKey() + " - " + e.getValue());
}

这会给出相同的结果,只是在第二种情况下,每个键都有一个条目 -> 集合项。

【问题讨论】:

  • Guava's Multimap 应该能够做你想做的事情(如果你可以从Map&lt;K, List&lt;V&gt;&gt; 切换)。如果您只对每个List&lt;String&gt; 的最里面的值感兴趣,那么还有Iterables.concat(relations.values())

标签: java collections


【解决方案1】:

我建议你看看 guava MultiMap 的实现。它已经有了这种迭代器:

要将Map&lt;K, Collection&lt;V&gt; 转换为MultiMap&lt;K, V&gt;,您可以使用实用方法:

public static <K,V> Multimap<K,V> toMultiMap(Map<K,? extends Collection<V>> m) {

    LinkedListMultimap<K, V> multimap = LinkedListMultimap.create();

    for (Entry<K, ? extends Collection<V>> e : m.entrySet())
        multimap.putAll(e.getKey(), e.getValue());

    return multimap;
}

用法:

public static void main(String[] args) {

    Map<String, List<Integer>> map = new HashMap<String, List<Integer>>();

    map.put("Hello", Arrays.asList(1, 2));
    map.put("World!", Arrays.asList(3));

    Multimap<String, Integer> multimap = toMultiMap(map);

    Iterator<Entry<String, Integer>> it = multimap.entries().iterator();

    while (it.hasNext())
        System.out.println(it.next());
}

输出:

Hello=1
Hello=2
World=3

【讨论】:

    【解决方案2】:

    没有比您用来迭代Map&lt;String, List&lt;String&gt;&gt; 更优雅的方法了。但更优雅的做法是使用Guava ListMultimap,它提供了一个entries() 方法,您可以直接对其进行迭代,而无需嵌套循环。

    【讨论】:

      【解决方案3】:

      我认为 Eclipse 的调试器正是这样做的,您可以查看实现。否则,您可以在实用程序类中编写一个辅助方法,因为据我所知,Collections 框架不支持此方法。

      【讨论】:

        猜你喜欢
        • 2022-01-13
        • 2019-08-24
        • 2017-07-23
        • 2020-05-18
        • 2022-01-23
        • 1970-01-01
        • 2012-04-21
        • 2020-01-25
        相关资源
        最近更新 更多