简体   繁体   中英

Best Way / data structure to count occurrences of strings

Lets assume I have a very long list of strings. I want to count the number of occurrences of each string. I don't know how many and of what kind the strings are (means: I have no dictionary of all possible strings)

My first idea was to create a Map and to increase the integer every time I find the key again.

But this feels a bit clumsy. Is there a better way to count all occurrences of those strings?

Since Java 8, the easiest way is to use streams:

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

Prior to Java 8, your currently outlined approach works just fine. (And the Java 8+ way is doing basically the same thing too, just with a more concise syntax).

You can do it without streams too:

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

list.forEach(x -> map.merge(x, 1L, Long::sum));

If you really want a specific datastructure, you can always look towards Guava's Multiset :

Usage will be similar to this:

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!

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM