ホームページ >Java >&#&チュートリアル >Java 8 でストリームを使用して単語の出現頻度を効率的にカウントするにはどうすればよいですか?

Java 8 でストリームを使用して単語の出現頻度を効率的にカウントするにはどうすればよいですか?

DDD
DDDオリジナル
2024-11-03 12:33:02558ブラウズ

How can I efficiently count word frequencies in Java 8 using streams?

Java 8 での単語頻度カウント: 合理化されたアプローチ

Java 8 では、リスト内の単語の頻度カウントをエレガントに実行できます。

次のリストの例を考えてみましょう。 List WordsList = Lists.newArrayList("hello", "bye", "ciao", "bye", "ciao");。単語の頻度をカウントするには、Collectors.groupingBy コレクターと Collectors.counting コレクターを利用します。

<code class="java">Map<String, Long> wordFrequencies = wordsList.stream()
    .collect(Collectors.groupingBy(Function.identity(), Collectors.counting()));</code>

このコードは、まず文字列 ID によってリスト要素をグループ化し、キーが一意の単語であり、値が固有であるマップを効果的に作成します。彼らの数。 Collectors.counting コレクターは、各単語のカウントを自動的に増分します。

結果のマップ wordFrequency は、印刷されると {ciao=2, hello=1, bye=2} のようになります。

または、整数値カウントの場合:

<code class="java">Map<String, Integer> wordFrequencies = wordsList.stream()
     .collect(Collectors.groupingBy(Function.identity(), Collectors.summingInt(e -> 1)));</code>

このバリアントは、Collectors.summingInt を使用して整数カウントを蓄積します。

結果のマップを値で並べ替えるには、追加のストリームとコレクターをチェーンできます。

<code class="java">LinkedHashMap<String, Long> countByWordSorted = wordFrequencies.entrySet()
            .stream()
            .sorted(Map.Entry.comparingByValue(Comparator.reverseOrder()))
            .collect(Collectors.toMap(
                    Map.Entry::getKey,
                    Map.Entry::getValue,
                    (v1, v2) -> { throw new IllegalStateException(); },
                    LinkedHashMap::new
            ));</code>

この並べ替えにより、最も頻繁に出現する単語がマップの最初に表示されます。

以上がJava 8 でストリームを使用して単語の出現頻度を効率的にカウントするにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。