如何在Java中交换arrayMap值和键

我在逆转给定地图并将其反转的键和值存储到另一个地图时遇到了一些麻烦。 我有一个方法原型如下:

public static Map<String, Set> reverse (Map <String, Set> graph); 

因此,如果我有有向图的样本密钥,那么:

 {c -> arraySet{f, e}} {b -> d} {a -> arraySet{c, b}} {d -> g} {e -> d} {f -> arraySet{g, d}} 

我需要有效地反转这个图,以便代替b – > d我有d – > b。

我认为所有这些要求对我来说是交换原始图中的值和键并将它们添加到reverseMap。 我想我可以迭代图中给定键的每组值,然后将它们存储在列表中。

不幸的是,我在实现这个问题时遇到了麻烦。 我真的很感激在正确的方向上轻推。

您需要遍历地图中的条目,然后,由于值存储在一个集合中,您需要循环遍历该集合。 您需要检查每个键的结果映射,并在键不存在时创建新的集。

 public static Map> reverse (Map > graph) { Map> result = new HashMap>(); for (Map.Entry> graphEntry: graph.entrySet()) { for (String graphValue: graphEntry.getValue()) { Set set = result.get(graphValue); if (set == null) { set = new HashSet(); result.put(graphValue, set); } set.add(graphEntry.getKey()); } } return result; } 

这是使用Guava Multimaps的实际,工作,最新的代码:

 SetMultimap graph = HashMultimap.create(); graph.put(1, 2); // add an edge from 1 to 2 SetMultimap inverse = Multimaps.invertFrom( graph, HashMultimap. create()); 

(披露:我向番石榴捐款。)

但如果您不能使用第三方库,请执行以下操作…

 Map> g; Map> gInverse = new HashMap>(); for (Map.Entry> gAdj : g.entrySet()) { Integer v = gAdj.getKey(); for (Integer w : gAdj.getValue()) { Set wInverseAdj = gInverse.get(w); if (wInverseAdj == null) { gInverse.put(w, wInverseAdj = new HashSet()); } wInverseAdj.add(v); } } 

或者,如果您可以使用Java 8,请使用此…

 map.entrySet().stream() .flatMap(entryKToVs -> entryKToVs.getValue().stream() .map(v -> new AbstractMap.SimpleEntry<>(entryKToVs.getKey(), str))) .collect(groupingBy(Map.Entry::getValue, mapping(Map.Entry::getKey, toList()))) 

伪代码,但接近真实。 只需使用Multimap 。

 Multimap ret = Multimaps.newSetMultimap(); for (Entry> entry : graph) { for(String neighbor : entry.getValue()) { ret.addTo(neighbor, entry.getKey()); } } 

我首先建议编写一个Graph类,它抽象出底层的Map数据结构。 当然,这只是将实现推送到Graph接口而不是直接处理Map接口。

所以现在,坚持你的地图:

 Map> graph; Map> reverse; 

我建议使用Map.entrySet()从graph获取条目集。 然后,对于每个Map.Entry ,检索每个Map.Entry的键和值。 接下来,对于值Set中的每个“顶点”,将键插入与顶点关联的Set中。

如果我将其格式化为类似于Java代码而不是英语句子,则可能会更清楚。 我希望你能得到基本的想法。 当然,如果它适合您的项目约束,那么使用预制和预先测试的解决方案将是首选。