Лучший способ / структура данных для подсчета вхождений строк - PullRequest
0 голосов
/ 04 сентября 2018

Предположим, у меня очень длинный список строк. Я хочу посчитать количество вхождений каждой строки. Я не знаю, сколько и какого типа строки (значит: у меня нет словаря всех возможных строк)

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

Но это кажется немного неуклюжим. Есть ли лучший способ подсчитать все вхождения этих строк?

Ответы [ 3 ]

0 голосов
/ 04 сентября 2018

Вы можете сделать это и без потоков:

Map<String, Long> map = new HashMap<>();

list.forEach(x -> map.merge(x, 1L, Long::sum));
0 голосов
/ 04 сентября 2018

Если вы действительно хотите конкретную структуру данных, вы всегда можете посмотреть на Guava's Multiset:

Использование будет примерно таким:

List<String> words = Arrays.asList("a b c a a".split(" "));

Multiset<String> wordCounts = words.stream()
  .collect(toCollection(HashMultiset::create));

wordCounts.count("a"); // returns 3
wordCounts.count("b"); // returns 1
wordCounts.count("z"); // returns 0, no need to handle null!
0 голосов
/ 04 сентября 2018

Начиная с Java 8, самый простой способ - использовать потоки:

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

До Java 8 ваш намеченный подход работает просто отлично. (И способ Java 8+ делает в основном то же самое, только с более кратким синтаксисом).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...