Уникальные значения с частотой отсчета из списка - PullRequest
1 голос
/ 13 октября 2019

Я пытаюсь подсчитать количество вхождений каждого элемента в List<List<String>> и сохранить результаты в Map<String,Long>.

Map<String, Long> map = new HashMap<>();    
for(List<String> l : data) {
        for(int i = 0; i < l.size(); i++) {
            String myString = l.get(i);
            long count = data.stream().filter(d -> myString.equals(d)).count();
            map.put(myString, count);
        }
    }

Мой код возвращает ноль в качестве значения для каждого ключа. Есть ли способ это исправить? Спасибо.

Ответы [ 2 ]

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

Попробуйте с этим:

List<List<String>> listOflists  = new ArrayList<>();
//Initialize your list here
Map<String, Long> map = listOflists.stream().flatMap(Collection::stream)
                    .collect(Collectors.groupingBy(Function.identity(), Collectors.counting()));
3 голосов
/ 13 октября 2019

Вы транслируете data, что List<List<String>>. Это означает, что каждый элемент потока имеет тип List<String>. Затем в лямбде filter вы пытаетесь увидеть, равно ли myString (типа String) d (типа List<String>). Это никогда не будет истинным, делая count равным 0 для всех элементов.

Вам нужно вызвать flatMap для потока, возвращаемого data.stream(), с аргументом функциибудучи List::stream (или Collection::stream). Для этого необходимо преобразовать поток List<String> в поток String, который затем можно вызвать методом filter.

...