2011-10-25 10 views
2

double while/forループでテキストファイルを読むことはできますか?ダブルwhileループでテキストファイルを読む

私はこのような何かをしたいと思います:

for(String row1 = 0; row1 < file.length; row1++) { 

    for(String row2 = row1 + 1; row2 < file.length; row2++){ 

     if(file[row1] == file[row2]){ 
      // other code 
     } 

    } 

} 

私は2.500.000行を持つファイル内の重複行を見つけるために持っているので、私は、二重ループを必要としています。 ヒープサイズが不十分で、行を保存できません。増やそうとすると、次のエラーが表示されます。 "VMの初期化中にエラーが発生しました オブジェクトヒープに十分なスペースを確保できませんでした できませんでしたJava仮想マシンを作成..」(私はWindows 7の64ビットおよび8 GBのRAMを持っている)事前に

おかげ

+1

あなたがデータベースを使用することもできます。 – SLaks

+0

ファイルにはどのくらいのバイトが含まれていますか? – Sibbo

+0

これらの重複行で何をしようとしていますか? – tjg184

答えて

6

ソート元のファイルを(あなたがそれを分割し、マージソートを使用することができます)。それから、dupを繰り返し探します(prev == curならdupを見つけました)。

+0

を提案しますが、このようにヒープの問題のサイズは残るべきですか...間違っていますか? – Webman

+0

@Webmanいいえ。ヒープサイズの問題は、ディスクに書き込まれたデータへの参照を保持していないので解決します。ガーベジコレクターはそのことを行うことができます。より詳細な説明と実装の詳細と疑似コードへのリンクがいくつかあります。 –

0

これは可能です。しかし、パフォーマンスはO(n²)ですが、あまり良くありません。また、==を使用することに注意してください。これは、2つのインスタンスが同じオブジェクトであるかどうかをチェックします。equalsと同じではありません。たぶん、各行のハッシュを計算し、それを使って起こりうる衝突を嗅ぐことができます。

+0

パフォーマンスは重要ではありません。重複した行を削除して新しいファイルを取得したいだけです。 – Webman

+0

その後、私はMoisheの解決策がうまくいくかどうかを調べます。ファイルを解析し、サイズの半分のファイルに出力し、これを再帰的に数回続けます。その後、小さなファイルから大きなファイルにマージソートを開始します。多くのIO、低速ですが、メモリの使用量を最小限に抑えることができます。 –

1

あなたの質問とそれに続くコメントに基づいて、大きなファイルに重複を見つけることが目的です。最悪のケースはO(N^2)です - すべてのオブジェクトを他のすべてのオブジェクトと比較します。より良い解決策は、まずソートすることです。

ファイルが大きすぎるため、メモリ内でソートするのに十分なメモリを割り当てることができないため、別の方法を使用する必要があります。 How could the UNIX sort command sort a very large file?は、インプリメントの詳細を提供します。一般的な問題は"external sorting"です。

ウィキペディアの擬似コードは、適切に実行して実装するのが適切でなければなりません。あなたが本当に勇気があるなら、UnixソートコマンドとKnuthブックの対応するページのアルゴリズムの詳細に取り組むことができます。

...そして最後に、私は本当に見直さかテストしていませんが、一部のGoogled code

+0

私はそれを勉強するのに十分な時間がありません:(私はデータベースの方法を選んだ – Webman

+0

これは質問に答えません。 – trojanfoe

関連する問題