2011-11-30 54 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

是一個TreeMap的List是一個荒謬的事情嗎?

概念不是,但它將會是非常內存低效(因爲Map雙方又因爲List的)。你正在尋找200%或更多的開銷。這可能是也可能不是可以接受的,這取決於你必須浪費多少內存。

對於內存更有效的解決方案,創建一個具有字段每列(包括Date)一類,把所有的List那些和排序它(最好使用快速排序)當你讀完。

+0

公平地說,映射的內存開銷取決於鍵的分佈。如果許多密鑰重複使用多次,這甚至可以節省內存。 – Ingo

+0

如何使用'List'作爲值的內存效率低下?如果您創建一個單獨的類作爲值,然後在該類內部存儲一個「List」,那麼您仍然創建相同數量的「Lists」。 – Michael

1

對使用​​列表沒有異議。雖然你的情況可能是List<Integer>作爲地圖的值將是適當的。

+0

你如何將日期時間映射到列表中的元素? – CKuck

+0

當然通過'Map'。同一個鍵下的列表中的每個元素都恰好具有該數據/時間。 – Ingo

+0

對不起,我只收錄了一小部分我的數據,還有更多的行不僅僅是日期,時間和價值。感謝您的建議,雖然:) – jackbot

2

使用List作爲Map的值沒有任何問題。所有這些<>看起來都很醜陋,但將一個泛型類放入泛型類中是完全正確的。

而不是使用String作爲關鍵,它可能會更好使用java.util.Date,因爲鍵是日期。這將允許TreeMap更準確地排序日期。如果您將日期存儲爲Strings,那麼TreeMap可能無法正確排序日期(它們將按字符串排序,而不是「真實」日期)。

Map<Date, List<String>> map = new TreeMap<Date, List<String>>();