Группировать список записей карты в одну запись на основе уникального ключа карты - PullRequest
0 голосов
/ 19 октября 2018

У меня есть список карт, List<Map>, где разные записи списка могут потенциально иметь одинаковое значение ID .Мне нужно объединить две записи списка в одну запись списка с одинаковым значением ключа и другими значениями, сгруппированными вместе.Например,

List<HashMap> data= new ArrayList<>();

Map<String, List<String>> map1= new HashMap<>();
Map<String, List<String>> map2= new HashMap<>();
Map<String, List<String>> map3= new HashMap<>();

map1.put("ID","100");
map1.put("Dept",Arrays.asList("Accounting,"Finance"));
map1.put("Employees",Arrays.asList("100","350"));

map2.put("ID","200");
map2.put("Dept",Arrays.asList("IT","Technology"));
map2.put("Employees",Arrays.asList("300",400"));

map3.put("ID","100");
map3.put("Dept",Arrays.asList("Health","Medical"));
map3.put("Employees",Arrays.asList("450","550"));

data.add(map1);
data.add(map2);
data.add(map3);

Мой список ввода будет иметь следующий вывод:

List data = [
    [ID: "100", Dept: ["Accounting","Finance"], Employees: ["100","350"]],
    [ID: "200", Dept: ["IT","Technology"], Employees: ["300","400"]],
    [ID: "100", Dept: ["Health","Medical"], Employees: ["450","550"]]   
]

Мой ожидаемый вывод должен быть:

List data = [
    [ID: "100", Dept: ["Accounting","Finance","Health","Medical"], Employees: "100","350",450","550"],
    [ID: "200", Dept: ["IT","Technology"], Employees: ["300","400"]]   
]

Я мог бы использоватьитератор и цикл, чтобы проверить, содержат ли записи списка те же значения идентификатора на карте, но есть ли лучший способ сделать это, используя функциональное программирование в java8?

Спасибо

1 Ответ

0 голосов
/ 19 октября 2018

Вот ваше желаемое решение:

import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;
import java.util.function.Function;
import java.util.stream.Collectors;

public class MergeMap{

  public static final String DEPT = "Dept";
  public static final String EMPLOYEES = "Employees";
  public static final String ID = "ID";

  public static void main(String[] args) {
    List<Map<String, List<String>>> data = new ArrayList<>();

    Map<String, List<String>> map1 = new ConcurrentHashMap<>();
    Map<String, List<String>> map2 = new ConcurrentHashMap<>();
    Map<String, List<String>> map3 = new ConcurrentHashMap<>();

    map1.put(ID, Arrays.asList("100"));
    map1.put(DEPT, Arrays.asList("Accounting", "Finance"));
    map1.put(EMPLOYEES, Arrays.asList("100", "350"));

    map2.put(ID, Arrays.asList("200"));
    map2.put(DEPT, Arrays.asList("IT", "Technology"));
    map2.put(EMPLOYEES, Arrays.asList("300", "400"));

    map3.put(ID, Arrays.asList("100"));
    map3.put(DEPT, Arrays.asList("Health", "Medical"));
    map3.put(EMPLOYEES, Arrays.asList("450", "550"));

    data.add(map1);
    data.add(map2);
    data.add(map3);
    System.out.println(data);//previous list

    List<Map> expectedList = data
        .stream()
        .collect(
            Collectors.collectingAndThen(Collectors.toMap(e -> e.get(ID), Function.identity(),
                (left, right) -> {
                  List<String> dept = new ArrayList<>();
                  List<String> emp = new ArrayList<>();
                  dept.addAll(left.get(DEPT));
                  dept.addAll(right.get(DEPT));
                  emp.addAll(left.get(EMPLOYEES));
                  emp.addAll(right.get(EMPLOYEES));
                  left.put(DEPT, dept);
                  left.put(EMPLOYEES, emp);
                  return left;
                }
            ), m -> new ArrayList<>(m.values())));
    System.out.println(expectedList); // new list

  }

}

Вот вывод: Перед объединением:

[{Dept=[Accounting, Finance], Employees=[100, 350], ID=[100]}, {Dept=[IT, Technology], Employees=[300, 400], ID=[200]}, {Dept=[Health, Medical], Employees=[450, 550], ID=[100]}]

После объединения:

[{Dept=[Accounting, Finance, Health, Medical], Employees=[100, 350, 450, 550], ID=[100]}, {Dept=[IT, Technology], Employees=[300, 400], ID=[200]}]
...