2017-02-10 4 views
-1

мне нужно посчитать количество вхождений для каждой строки вJava 8 Количество числа копий для каждой строки в ArrayList из ArrayLists

ArrayList<ArrayList<String>> 

Я знаю, как сделать это старый Java 7 и ниже пути, но захотите сделать это с помощью потоков и коллекционеров

В идеале я бы сохранил результат в HashMap<String, Integer>, где целое число - это число вхождений, а String - соответствующая строка.

Это может быть наоборот - не большое дело.

Я нашел решение, как сделать это для ArrayListhere

Map<String, Long> counts = 
    list.stream().collect(Collectors.groupingBy(Function.identity(), Collectors.counting())); 

но мой случай является более сложным, поскольку что это ArrayListArrayList из с.

Структура следующая String itemId = list.get(i).getProducts().get(j).getItemId();

+4

Что вы имеете в виду «подсчитать количество дублей»? Вы скорее имеете в виду «количество вхождений»? – Holger

ответ

5

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

Map<String, Long> counts = list.stream().flatMap(List::stream) 
    .collect(Collectors.groupingBy(e -> e, Collectors.counting())); 

если иметь Integer в качестве значения тип очень важен для вас, вы можете использовать

Map<String, Integer> counts = list.stream().flatMap(List::stream) 
    .collect(Collectors.groupingBy(e -> e, Collectors.summingInt(x -> 1))); 

вместо этого.

Кроме того, решение, основанное на обычных петлях могут также извлечь выгоду из Java 8 функций:

Map<String, Integer> counts = new HashMap<>(); 
for(List<String> l: list) 
    for(String s: l) 
     counts.merge(s, 1, Integer::sum); 
+0

Я получаю следующую ошибку (для первого варианта, который вы упомянули). Множественные маркеры на этой линии \t - поток не может быть решен \t - Несоответствие типа: не может конвертировать из потока в \t Andrei

+0

Ну, если он говорит, «поток не может быть решен», у вас есть серьезные проблемы в вашей установке проекта , так как приведенный выше код не содержит ссылок на 'Stream'. Но все же проверьте, правильно ли вы импортировали каждый тип, который используете. Или вы имеете в виду «поток» (строчный)? В приведенном выше коде предполагается, что у вас есть 'ArrayList >', как вы заявили в своем вопросе, а не что-либо, имеющее метод getProducts(), который добавлен к нему через пять дней. – Holger

+0

Вы можете исправить это, изменив '.flatMap (List :: stream)' на '.flatMap (o-> o.getProducts(). Stream())', но в будущем представьте правильное описание проблемы, когда вы отправьте свой вопрос на начальном этапе. – Holger