Группировка в arrayList из arrayList - PullRequest
0 голосов
/ 28 декабря 2018

Привет, у меня есть строковый ArrayList ArrayList.Пример показан ниже:

  [[765,servus, burdnare],
   [764,asinj, ferrantis],
   [764,asinj, ferrantis],
   [764,asinj, ferrantis],
   [762,asinj, ferrantis],
   [756,peciam terre, cisterne],
   [756,peciam terre, cortile],
   [756,peciam terre, domo],
   [756,asinj, ferrantis]]

Можно ли получить список уникальных значений по индексу 1 для каждого значения индекса 0 ... Ожидаемый результат:

765 - [servus]
764 - [asinj]
762 - [asinj]
756 - [peciam terre, asinj]

Я пробовал серию операторов if, однако, не сработало

Ответы [ 3 ]

0 голосов
/ 28 декабря 2018

Один из возможных вариантов.Просто выполните итерацию по заданному списку и создайте Map с необходимыми key и Set в качестве значения, чтобы игнорировать дубликаты.

public static Map<String, Set<String>> group(List<List<String>> listOfList) {
    Map<String, Set<String>> map = new LinkedHashMap<>();

    listOfList.forEach(item -> map.compute(item.get(0), (id, names) -> {
        (names = Optional.ofNullable(names).orElseGet(HashSet::new)).add(item.get(1));
        return names;
    }));

    return map;
}
0 голосов
/ 28 декабря 2018

Если у вас есть List<List<String>> в качестве источника, вы можете использовать forEach + computeIfAbsent:

Map<String, Set<String>> map = new HashMap<>();
list.forEach(l -> map.computeIfAbsent(l.get(0), k -> new HashSet<>()).add(l.get(1)));
0 голосов
/ 28 декабря 2018

Вы можете группировать по элементу index-0 и собирать элементы index-1 в Set, чтобы получить уникальный

List<List<String>> listOfList = ...//

Map<String, Set<String>> collect = listOfList.stream()
        .filter(l -> l.size() >= 2)
        .collect(Collectors.groupingBy(l -> l.get(0), Collectors.mapping(l -> l.get(1), Collectors.toSet())));
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...