Java: преобразование списка <List>в карту - PullRequest
0 голосов
/ 24 сентября 2019

Учитывая список однозначных подсписков (то есть два разных подсписка не могут совместно использовать элементы с одинаковым значением) - например:

List[List[1, 1, 1], List[2], List[4, 4], List[7]]

как это будет преобразованов карту с парой ключ-значение (значение, размер)?

Это приведет к:

{
  1 : 3
  2 : 1
  4 : 2
  7 : 1
}

Определяя наш список как values, я бы предположил, что можно использоватьПотоки и собирать в виде карты следующим образом:

values.stream().collect(Collectors.toMap(Integer::intValue, ? ));

В настоящее время не уверены, что ввести для второго параметра, поскольку он требует value mapper, но не позволяет .size() длябыть призванным к любому из подсписков.

Ответы [ 3 ]

7 голосов
/ 25 сентября 2019

При использовании Collectors.toMap необходимо указать, как получить ключ и значение из каждого элемента потока.Integer::intValue здесь не будет работать, потому что ваши элементы потока являются списками, а не целыми числами.

Для ключа получите первый элемент списка.(Предполагается, что все внутренние списки не пусты.) Для значения передайте ссылку на метод size.

values.stream()
    .collect(Collectors.toMap(list -> list.get(0), List::size));
1 голос
/ 25 сентября 2019

Я думаю, @ rgettman ответ самый элегантный.Однако предполагается, что все списки не являются пустыми.Конечно, это легко исправить, просто добавив .filter(list -> !list.isEmpty()) перед операцией сокращения collect.

Это еще один подход, который больше не считает список «двумерным», то есть List<List<Integer>>, но вместо этого выравнивает его до потока Integer с.

Map<Integer, Long> map = lists.stream()
    .flatMap(Collection::stream)
    .collect(Collectors.groupingBy(Function.identity(), Collectors.counting()));
1 голос
/ 25 сентября 2019

Вы можете сгладить список, а затем использовать что-то вроде Collectors.groupingBy (Function.identity (), Collectors.counting ()).Однако в этом случае я бы сказал, что старый добрый (вложенный) цикл может быть проще для записи и чтения.

List<List<Integer>> lst = Arrays.asList(Arrays.asList(1,1,1),Arrays.asList(2),Arrays.asList(4,4),Arrays.asList(7));

Map<Integer,Integer> result= new HashMap<Integer,Integer>();
System.out.println(lst);
//[[1, 1, 1], [2], [4, 4], [7]]

for(List<Integer> sub:lst){
  for(int n:sub){
    Integer last=result.get(n);
    int newCount=(last==null?0:last)+1;
    result.put(n, newCount);
  }
}
System.out.println(result);
//{1=3, 2=1, 4=2, 7=1}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...