迭代“非规范化”集合图的最佳方法是什么?
例如,我有以下地图:
Map<String, List<String>> relations;
为了遍历每个密钥 - &gt;每个值我做的事情如下:
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());
}
这会产生相同的结果,仅在第二种情况下,每个键都有一个条目 - &gt;收集项目。
答案 0 :(得分:4)
我建议你看一下guavas MultiMap
的实现。它已经有了这种迭代器:
要将Map<K, Collection<V>
转换为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
答案 1 :(得分:3)
没有更优雅的方式可以用来迭代Map<String, List<String>>
。但更优雅的做法是使用Guava ListMultimap,它提供了一个entries()
方法,您可以直接迭代,而不需要嵌套循环。
答案 2 :(得分:0)
我认为Eclipse的调试器正是如此,你可以查看实现。否则你可以在实用程序类中编写一个帮助器方法,例如,因为据我所知,Collections框架不支持这个。