6

Java ファイルを読み込んで同時に変更しようとしています。これは私がする必要があることです:私のファイルはフォーマットです:

aaa
bbb
aaa
ccc
ddd
ddd

ファイルを読み込んで出現回数を取得し、重複を変更して次のファイルを取得する必要があります。

aaa -  2
bbb -  1
ccc -  1
ddd -  2

これを行うためにを使用しようとしましたRandomAccessFileが、できませんでした。誰かがこのコードを手伝ってくれますか?

4

4 に答える 4

8

2 つのことを同時に行わない方がはるかに簡単です。最良の方法は、ファイル全体を実行し、ハッシュ内の各文字列のすべての出現を数え、すべての結果を別のファイルに書き出すことです。次に、必要に応じて、新しいファイルを古いファイルの上に移動します。

同じファイルの読み取りと書き込みを同時に行いたくありません。ファイル内のオフセットは、書き込みを行うたびにシフトし、読み取りカーソルはそれを追跡しません。

于 2010-11-22T23:15:41.880 に答える
1

このようにします: - 元のファイルを解析し、すべてのエントリを新しいファイルに保存します。固定長のデータ ブロックを使用してエントリを新しいファイルに書き込みます (つまり、最長の文字列が 10 バイトであるとします。ブロックの長さとして 10 + x を使用します。x は、エントリに沿って保存する追加情報です。つまり、10 番目のエントリファイル内のバイト位置は 10*(10+x)) になります。また、作成するエントリの数を知る必要があります (そのため、ファイル サイズは noOfEntries*blocklength になり、RandomAccesFile と setLength を使用してこのファイルの長さを設定します)。- クイックソート アルゴリズムを使用して、ファイル内のエントリを並べ替えます (私の考えでは、最後に並べ替えられたファイルを作成することで、最終的に物事がはるかに簡単かつ高速になります。理論的にはハッシュも機能しますが、重複するエントリの再配置に対処する必要があります。次に、すべての重複をグループ化します-ここでは実際には選択できません)。- ソートされたエントリでファイルを解析します。エントリが最初に出現したエントリへのポインタを保存します。新しいエントリがあるまで、重複の数を増やします。最初のエントリを変更し、必要な追加情報を新しい「最終結果」ファイルに追加します。ソートされたファイルの残りのすべてのエントリについて、この方法を続けます。

結論: これはかなり高速で、適度な量のリソースを使用する必要があると思います。ただし、それはあなたが持っているデータに依存します。重複が非常に多い場合、クイックソートのパフォーマンスが低下します。また、最長のデータ エントリが平均よりもはるかに長い場合、ファイル スペースも浪費されます。

于 2011-02-22T14:36:37.293 に答える
0

必要に応じて、別のファイルを開いたり、すべてをメモリに保持したりすることなく、同じファイルを操作してカウンターを更新する方法があります。ただし、最も単純なアプローチは非常に遅くなります。

于 2010-11-23T00:44:46.670 に答える