0

文字列配列をループして、一意の単語とその出現箇所を出力し、それらをファイルに出力するプログラムを作成しました。この部分は完全に機能しますが、一意の単語の総数を取得する方法がわかりません。カウンターの int 配列を作成する必要があると感じていますが、これを行う方法を正確に把握していません。残念ながら、ハッシュマップ、セット、またはリストを使用することは許可されていません。配列に固執する必要があります。

boolean [] done = new boolean[textfile.length];
for(int i = 0; i<textfile.length; i++){
    if(done[i])
        continue;
    int nb = 0;
    for(int j = i; j < textfile.length; j++){
        if(done[j])
            continue;
        if(textfile[i].equals(textfile[j])){
            done[j] = true;
            nb++;

        }
    }

    pw.println(textfile[i] + "occurs " + nb + " times");
}
4

5 に答える 5

1

次のようにすることをお勧めします-

-配列内のすべての値を追加し、この配列をソートします。(一意のエントリを取得しやすいように)

-並べ替えられた配列のすべての要素を (1 つずつ) 比較する単語と比較します。

-テキスト ファイル内の単語を配列内の単語と比較する際i.e. counterに、一意の文字が出現するたびにインクリメントされ、将来の使用のために値を保持するグローバル変数を維持します。

于 2013-10-09T10:50:38.783 に答える
1

現在、各単語をファイル内の後続のすべての単語と比較していますが、これにはO(N^2)時間がかかります。代わりに、すべての単語を含む配列を作成し、O(NlogN)時間がかかる辞書順で並べ替えてから、配列を反復処理して出現回数を数えることができます一意の単語ごとに (隣接する 2 つの単語が等しい場合はカウントを続け、そうでない場合はカウンターを出力してリセットします)、時間がかかりO(N)ます。

于 2013-10-09T10:31:20.317 に答える
0

nb外側のループの反復ごとに変数を再初期化しています。したがって、最後の反復で処理された一意の単語の数が失われます。

U はint nb = 0;外側を最初の for ループに配置する必要があります。

于 2013-10-09T10:29:38.137 に答える
0

最も簡単な方法は次のとおりです。

  1. 配列をソートする
  2. ソートされた配列をたどり、最後の一意のエントリを記憶する
  3. lastUniqueEntry が次のエントリと異なる場合。ユニークカウント + 1
  4. 一意の単語とその出現箇所を出力するなど、他のすべてを行います
于 2013-10-09T10:34:16.977 に答える
0

最初の for の外で uniqe_counter を設定し、印刷前に nb == 1 になるたびにインクリメントすることができます

于 2013-10-09T10:27:59.267 に答える