Java ファイルを読み込んで同時に変更しようとしています。これは私がする必要があることです:私のファイルはフォーマットです:
aaa
bbb
aaa
ccc
ddd
ddd
ファイルを読み込んで出現回数を取得し、重複を変更して次のファイルを取得する必要があります。
aaa - 2
bbb - 1
ccc - 1
ddd - 2
これを行うためにを使用しようとしましたRandomAccessFile
が、できませんでした。誰かがこのコードを手伝ってくれますか?
2 つのことを同時に行わない方がはるかに簡単です。最良の方法は、ファイル全体を実行し、ハッシュ内の各文字列のすべての出現を数え、すべての結果を別のファイルに書き出すことです。次に、必要に応じて、新しいファイルを古いファイルの上に移動します。
同じファイルの読み取りと書き込みを同時に行いたくありません。ファイル内のオフセットは、書き込みを行うたびにシフトし、読み取りカーソルはそれを追跡しません。
このようにします: - 元のファイルを解析し、すべてのエントリを新しいファイルに保存します。固定長のデータ ブロックを使用してエントリを新しいファイルに書き込みます (つまり、最長の文字列が 10 バイトであるとします。ブロックの長さとして 10 + x を使用します。x は、エントリに沿って保存する追加情報です。つまり、10 番目のエントリファイル内のバイト位置は 10*(10+x)) になります。また、作成するエントリの数を知る必要があります (そのため、ファイル サイズは noOfEntries*blocklength になり、RandomAccesFile と setLength を使用してこのファイルの長さを設定します)。- クイックソート アルゴリズムを使用して、ファイル内のエントリを並べ替えます (私の考えでは、最後に並べ替えられたファイルを作成することで、最終的に物事がはるかに簡単かつ高速になります。理論的にはハッシュも機能しますが、重複するエントリの再配置に対処する必要があります。次に、すべての重複をグループ化します-ここでは実際には選択できません)。- ソートされたエントリでファイルを解析します。エントリが最初に出現したエントリへのポインタを保存します。新しいエントリがあるまで、重複の数を増やします。最初のエントリを変更し、必要な追加情報を新しい「最終結果」ファイルに追加します。ソートされたファイルの残りのすべてのエントリについて、この方法を続けます。
結論: これはかなり高速で、適度な量のリソースを使用する必要があると思います。ただし、それはあなたが持っているデータに依存します。重複が非常に多い場合、クイックソートのパフォーマンスが低下します。また、最長のデータ エントリが平均よりもはるかに長い場合、ファイル スペースも浪費されます。
必要に応じて、別のファイルを開いたり、すべてをメモリに保持したりすることなく、同じファイルを操作してカウンターを更新する方法があります。ただし、最も単純なアプローチは非常に遅くなります。