Guava Multimapsを使用した、実際に動作する最新のコードを次に示します。
SetMultimap<Integer, Integer> graph = HashMultimap.create();
graph.put(1, 2); // add an edge from 1 to 2
SetMultimap<Integer, Integer> inverse = Multimaps.invertFrom(
graph, HashMultimap.<Integer, Integer> create());
(開示:私はGuavaに貢献しています。)
ただし、サードパーティのライブラリを使用できない場合は、次のようにしてください...
Map<Integer, Set<Integer>> g;
Map<Integer, Set<Integer>> gInverse = new HashMap<Integer, Set<Integer>>();
for (Map.Entry<Integer, Set<Integer>> gAdj : g.entrySet()) {
Integer v = gAdj.getKey();
for (Integer w : gAdj.getValue()) {
Set<Integer> wInverseAdj = gInverse.get(w);
if (wInverseAdj == null) {
gInverse.put(w, wInverseAdj = new HashSet<Integer>());
}
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())))