Это решение аналогично предложенному в ответе Федерико Перальта Шаффнера , за исключением того, что вместо forEach
он использует for
-loops.Я в основном публикую это, чтобы иметь MCVE и короткий пример ввода / вывода, но также в качестве противовеса для потокового решения.Теперь люди могут спорить о удобочитаемости и удобстве обслуживания.
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collection;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collection;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;
public class InvertMapWithLists
{
public static void main(String[] args)
{
Map<String, List<Integer>> map =
new LinkedHashMap<String, List<Integer>>();
map.put("A", Arrays.asList(0,1,2));
map.put("B", Arrays.asList(2,3,4));
map.put("C", Arrays.asList(4,5,6));
System.out.println("Original:");
map.entrySet().forEach(System.out::println);
Map<Integer, List<String>> inverted = invert(map);
System.out.println("Inverted");
inverted.entrySet().forEach(System.out::println);
}
private static <T, K> Map<T, List<K>> invert(
Map<K, ? extends Collection<? extends T>> map)
{
Map<T, List<K>> result = new LinkedHashMap<T, List<K>>();
for (Entry<K, ? extends Collection<? extends T>> entry : map.entrySet())
{
for (T element : entry.getValue())
{
List<K> list = result.computeIfAbsent(
element, v -> new ArrayList<K>());
list.add(entry.getKey());
}
}
return result;
}
}
Вывод:
Original:
A=[0, 1, 2]
B=[2, 3, 4]
C=[4, 5, 6]
Inverted
0=[A]
1=[A]
2=[A, B]
3=[B]
4=[B, C]
5=[C]
6=[C]