2011-11-30 8 views
1

私は解析したいと思う比較的大きなテキストファイル(〜4m行)を持っています。データを格納する適切なデータ構造についてのアドバイスを探しています。ファイルには、次のような行が含まれています。大きなデータファイルを解析するのに適したJavaデータ構造

Date  Time Value 
2011-11-30 09:00 10 
2011-11-30 09:15 5 
2011-12-01 12:42 14 
2011-12-01 19:58 19 
2011-12-01 02:03 12 

私の最初の考えは、行の残りの部分に日付をマップするためにTreeMap<String, List<String>>を使用していたが、TreeMapListのSAばかげているので、私はグループに日付別の行をしたいですやるべき事?私は、文字列のキーを日付オブジェクトで置き換えることができると思いますが(それほど多くの文字列の比較を排除するため)、Listという値は不適切だと思います。

私はTreeMapを使用しています。これは、日付順にキーを繰り返したいからです。

答えて

1

は、ばかげたことですか?

概念的

ないが、非常にメモリ効率の悪い(なぜならMapのと理由Listの両方)になるだろう。あなたは200%以上のオーバーヘッドを見ています。どのくらいのメモリを浪費しなければならないかによって、受け入れられるかもしれません。より多くのメモリ効率の高いソリューションのために

Listにすべてのそれらを入れて、(クイックソートを使用して理想的には)それをソートし、(Dateを含む)すべての列のフィールドを持つクラスを作成するには、読み終わっています。

+0

地図のメモリオーバーヘッドは、鍵の配布に少し依存します。多くのキーが何度も再利用されると、メモリを節約することさえできます。 – Ingo

+0

値として 'List'を使用するのはどのようにメモリが非効率ですか?別のクラスを作成して値として使用し、そのクラスの中に 'List'を格納すると、同じ数の' Lists'が作成されます。 – Michael

1

リストを使用することに異論はありません。あなたの場合はおそらくList<Integer>の値が適切かもしれませんが。

+0

そして、日時をリストの要素にどのようにマッピングしますか? – CKuck

+0

もちろん、 'Map'を通して。同じキーの下のリストのすべての要素は、そのデータ/時間を正確に持っていました。 – Ingo

+0

申し訳ありませんが、私はわずかなサンプルのデータしか含んでいませんでした。日付、時刻、値よりも多くの行があります。あなたの提案をありがとう:) – jackbot

2

Mapの値にListを使用しても問題はありません。これらのすべては醜いですが、ジェネリッククラスをジェネリッククラスの中に置くことはまったく問題ありません。

Stringをキーとして使用する代わりに、キーが日付であるためjava.util.Dateを使用することをお勧めします。これにより、TreeMapはより正確に日付を並べ替えることができます。 Stringsとして日付を保存すると、TreeMapは日付を適切にソートしないことがあります(これらの日付は「実際」の日付ではなく文字列としてソートされます)。

Map<Date, List<String>> map = new TreeMap<Date, List<String>>(); 
関連する問題