-2

大きなテキストファイル(1Gをはるかに超えるサイズ)があり、Javaを使用してそのファイル内の特定の単語の出現をカウントしたいと思います。ファイル内のテキストは1行で書かれているため、1行ずつ確認できない場合があります。この問題に取り組むための最良の方法は何でしょうか?

4

4 に答える 4

2

JavaのScannerクラスを使用して、その巨大なファイルを単語ごとに消費したいとします。useDelimiter(...)メソッドを1回呼び出して、単語の分割方法(おそらくスペース文字のみ)を構成し、その後、hasNext()とgetNext()を使用してファイルコンテンツをループします。

カウント自体については、簡単にするためにHashMapを使用できます。

于 2012-05-12T05:40:47.740 に答える
1

Trieデータ構造のわずかなバリエーションを使用できます。このDSは、単語の辞書を作成するために使用されます。「スタック」を検索する例では、「Sta」を渡すことでトライを検索でき、「Sta」で始まるすべての単語が返されます。

今、あなたの問題では、ファイルを単語ごとにトラバースして、それをトライに入れることができます。すべての単語にフィールド「count」を追加します。これで、変更された試行に挿入するときに、「カウント」を増やすことができます。これで、トライ内のすべての単語がカウントされます。

1Gファイル内のほとんどの単語が繰り返されるため、メモリ使用量はそれほど多くないはずです。ファイルをトラバースする必要があるのは1回だけです。また、このトライを取得すると、パフォーマンスを低下させることなく、複数の単語を検索できます。

編集:

完全一致が必要な場合は、HashMapも優れたソリューションであるという@Bananeweizenに同意する必要があります。したがって、単語ごとに読み、HashMapに入れます。メモリ使用量はtryと同じである必要があります。

于 2012-05-12T05:46:35.230 に答える
0

まず、アルファベット順に単語を並べ替える必要があります。データを読み込んで単語をスペースで分割した後、これを行う方法はいくつかあります。また、並べ替えの前に特殊文字と句読点を削除する必要があります。

並べ替えると、ターゲットとする単語がすべて並んで表示されるため、検索がO(N)の問題になります。その時点で、ループ構造を使用して、単語の最初のインスタンスが見つかるまで各単語を調べて比較することができます。その時点で、ループを続け、次の単語に到達するまで各単語を数えます。

その時点で、コレクションにその単語のインスタンスがもうないことがわかり、検索を停止できます。

この特定の検索アルゴリズムは、O(N)の最悪のシナリオです。単語が「apple」の場合、検索は「zebra」の場合よりもはるかに速く完了する可能性があります。

正確なニーズに応じて、選択できる他のアルゴリズムがあります。

あなたの質問から、これはプログラミングの練習であり、実際の仕事の問題ではないと思います。それが仕事上の問題である場合、この問題はすでに数え切れないほど解決されており、Java標準ライブラリのツールを含め、この問題の解決に役立つJava用の検索ライブラリが数多くあります。

于 2012-05-12T05:39:41.210 に答える
-2

外部ツールを使用してテキストインデックスを作成できます。その後、このインデックスでさまざまな単語をすばやく見つけることができます。たとえば、そのようなインデックスを作成するためにLuceneを入手できます。そして、simpeはその中の用語の頻度を取得します。記事やコード例へのリンクを含むluceneインデックスの単語頻度を数える同様の質問がありました。

于 2012-05-12T05:37:39.363 に答える