Menu
Coddy logo textTech

復習:単語の出現頻度

CoddyのC++ジャーニー「オブジェクト指向プログラミング」セクションの一部 — レッスン 75/104。

challenge icon

チャレンジ

簡単

テキストを処理し、頻度順にソートされた単語数を表示する単語頻度アナライザー(Word Frequency Analyzer)を作成しましょう。これは、これまでに学んだすべてのSTLコンポーネント(カウント用の map、ソート用の vector、トラバーサル用のイテレータ、カスタムソートロジック用のラムダ式)を組み合わせた、古典的なテキスト処理タスクです。

コードは2つのファイルに分けて構成します:

  • WordAnalyzer.h: 単語のカウントと分析を管理する WordAnalyzer クラスを定義します。

    クラス内部では、単語数を保存するために std::map<std::string, int> を使用してください。以下のメソッドを実装します:

    • addWord(const std::string& word) — 指定された単語のカウントをインクリメントします。
    • getCount(const std::string& word) — 特定の単語のカウントを返します(見つからない場合は0)。
    • getTotalWords() — 追加された単語の総数を返します(すべてのカウントの合計)。
    • getUniqueWords() — ユニークな単語の数を返します(マップのサイズ)。
    • printByFrequency() — すべての単語を頻度の降順でソートして出力します。頻度が同じ単語については、アルファベット順にソートしてください。各行には word: count の形式で表示します。

    printByFrequency() の実装では、マップの内容をペアのベクター(vector of pairs)に転送し、std::sort を使用します。ラムダ式を用いて、まずカウントで比較し(降順)、同じ場合は単語で比較(昇順)するようにします。

  • main.cpp: 最初の行で、その後に続く単語の数を示す整数 n を読み取ります。その後、n 個の単語を1行ずつ読み取ります。

    WordAnalyzer を作成し、すべての単語を追加した後、以下を表示します:

    1. Total words: <count> を出力します。
    2. Unique words: <count> を出力します。
    3. Word frequencies: を出力し、続いて printByFrequency() を呼び出します。

例えば、以下の入力の場合:

7
apple
banana
apple
cherry
banana
apple
date

出力は以下のようになります:

Total words: 7
Unique words: 4
Word frequencies:
apple: 3
banana: 2
cherry: 1
date: 1

apple が最初に表示され(最高頻度)、次に banana、そして cherrydate はカウントが同じであるためアルファベット順にソートされていることに注目してください。

別の入力例:

5
the
cat
the
sat
the

出力:

Total words: 5
Unique words: 3
Word frequencies:
the: 3
cat: 1
sat: 1

自分で試してみよう

#include <iostream>
#include <string>
#include "WordAnalyzer.h"

using namespace std;

int main() {
    int n;
    cin >> n;
    
    WordAnalyzer analyzer;
    
    // TODO: n 個の単語を読み込み、analyzer に追加する
    
    // TODO: "Total words: <count>" を出力する
    
    // TODO: "Unique words: <count>" を出力する
    
    // TODO: "Word frequencies:" を出力し、printByFrequency() を呼び出す
    
    return 0;
}

オブジェクト指向プログラミングのすべてのレッスン