3

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

例如,我有以下地图:

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());
}

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

4

3 回答 3

4

我建议你看一下番石榴的MultiMap实现。它已经有这种迭代器:

要将 a 转换Map<K, Collection<V>为 a,MultiMap<K, V>您可以使用实用程序方法:

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
于 2012-06-05T08:41:21.573 回答
3

没有比您用来迭代Map<String, List<String>>. 但是更优雅的做法是使用Guava ListMultimap,它提供了entries()一种可以直接迭代的方法,无需嵌套循环。

于 2012-06-05T08:42:02.527 回答
0

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

于 2012-06-05T08:37:12.810 回答