Собрать картуиз потока карты> - PullRequest
1 голос
/ 14 октября 2019

У меня есть вложенная карта с ключом в качестве имени сотрудника и значениями в качестве другой карты с ключом в качестве названия компании и значением в качестве многолетнего опыта, как показано ниже

Map<String, Map<String, Integer>> map = new HashMap<>();
    Map<String, Integer> innerMap1 = new HashMap<>();
    innerMap1.put("INfosys", 2);
    innerMap1.put("Volvo", 2);
    innerMap1.put("MH", 3);
    innerMap1.put("Piterion", 1);

    Map<String, Integer> innerMap2 = new HashMap<>();
    innerMap2.put("Tata", 2);
    innerMap2.put("Bosch", 1);
    innerMap2.put("Amber", 1);
    innerMap2.put("E2", 1);

    map.put("Rahul", innerMap1);
    map.put("Amrita", innerMap2);

Теперь моя функция должна возвращать карту с сотрудникомимя как ключ и общий опыт как ценность. Как я могу сделать это, используя потоки Java (в одном потоке)

public Map<String, Integer> getEmployeesWithExp(Map<String, Map<String, Integer>> map) {
    map.entrySet().stream().
                        ...

    return null;
}

Ответы [ 3 ]

4 голосов
/ 14 октября 2019

Возможно, есть несколько способов, но вы можете collect ввести записи в новую карту и уменьшить значения внутренних карт до целых чисел, например, так:

Map<String, Integer> result = 
           map.entrySet().stream()
              .collect( 
                  Collectors.toMap(e -> e.getKey(), //or Map.Entry::getKey
                                    e -> e.getValue().values().stream()
                                                      .reduce(0, Integer::sum)));
1 голос
/ 14 октября 2019

Это просто для циклов, используемых для решения: -

    Map<String, Integer> finalMap = new HashMap<>();
    for (Entry<String, Map<String, Integer>> entry : map.entrySet()) {
        Integer exp = 0;
        for (Entry<String, Integer> entry2 : entry.getValue().entrySet()) {
            exp += entry2.getValue();
        }
        finalMap.put(entry.getKey(), exp);
    }

Выход - {Amrita = 5, Rahul = 8}

1 голос
/ 14 октября 2019

Это первый раз, когда я пытался использовать потоки с картами, это было довольно хорошее упражнение, спасибо.

Хотя мне не удалось сделать это только в одном потоке. Это решение имеет один основной поток и внутренние потоки.

Я использовал org.apache.commons.lang3.tuple.Pair, кстати.

Map<String, Integer> result = map.entrySet().stream()
        .map(entry -> Pair.of(entry.getKey(), entry.getValue().values().stream().reduce(0, Integer::sum)))
        .collect(Collectors.toMap(Pair::getKey, Pair::getValue));

Он ответил

 "Amrita" → 5
 "Rahul" → 8

Я считаю, что этоверный. : D

...