Инвертировать картуиспользуя Java 8 - PullRequest
1 голос
/ 01 октября 2019

Мне нужно инвертировать карту с <String, List<String>> до Map<String,String>, используя java 8. с предположением, что значения уникальны. Например,

Карта ввода -

{"Fruit" -> ["apple","orange"], "Animal" -> ["Dog","Cat"]}

Карта вывода

{"apple" -> "Fruit", "orange" -> "Fruit", "Dog"->"Animal", "Cat" -> "Animal"}
Map <String, String> outputMap = new HashMap<>();
for (Map.Entry<String, List<String>> entry : inputMap.entrySet()) {
    entry.getValue().forEach(value -> outputMap.put(value, entry.getKey()));
}   

Это правильно? мы можем достичь этого с помощью потоков Java 8?

Ответы [ 2 ]

0 голосов
/ 02 октября 2019

Вы можете попробовать таким образом

Map <String, String> updatedMap = new HashMap<>();
oldMap.keySet()
      .forEach(i -> oldMap.get(i)
                          .forEach(k -> updatedMap.put(k, i)));
0 голосов
/ 01 октября 2019

Делай так:

public class InverterMap {
    public static void main(String[] args) {

        Map<String, List<String>> mp = new HashMap<String, List<String>>();
        mp.put("Fruit", Arrays.asList("Apple", "Orange"));
        mp.put("Animal", Arrays.asList("Dog", "Cat"));
        System.out.println(mp);  // It returned {Fruit=[Apple, Orange], Animal=[Dog, Cat]}

        Map<String, String> invertMap = mp.entrySet().stream().collect(HashMap::new,
            (m, v) -> v.getValue().forEach(k -> m.put(k, v.getKey())), Map::putAll);

        System.out.println(invertMap);// It returned {Apple=Fruit, Cat=Animal, Orange=Fruit, Dog=Animal}

    }

}
...