1. ホーム

[解決済み】groupByで出現回数を数えるには?

2022-04-07 03:35:37

質問

ストリーム内のアイテムを、同じオブジェクトをグループ化し、出現回数にマッピングするマップに集めたい。

List<String> list = Arrays.asList("Hello", "Hello", "World");
Map<String, Long> wordToFrequency = // what goes here?

そこで今回は、このようなエントリで構成されるマップを作成したいと思います。

Hello -> 2
World -> 1

どうすればいいのでしょうか?

どのように解決するのですか?

を探しているところだと思います。 オーバーロード これは、別の Collector を使って、それぞれのグループに対して何をするかを指定する......そして Collectors.counting() を使用してカウントを行います。

import java.util.*;
import java.util.stream.*;

class Test {
    public static void main(String[] args) {
        List<String> list = new ArrayList<>();

        list.add("Hello");
        list.add("Hello");
        list.add("World");

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

        System.out.println(counted);
    }
}

結果

{Hello=2, World=1}

(を使用することも可能です。 groupingByConcurrent を使用すると、より効率的です。もしそれがあなたのコンテキストで安全であるならば、あなたの実際のコードで心に留めておくべきことです)。