考虑一个具有以下结构的巨大CSV(为简单起见而修改):
ID, NAME, ADDRESS, PHONE, MAIL
1, Jon, UK, 403, jon@skeet.com
2, Marc, UK, 292, marc@gravel.com
3, Darin, France, 291, darin@dimitrov.com
...
(Some million records)
快速提取的自然数据结构是一个哈希表,其中每个ID
都是一个键,NAME, ADDRESS, PHONE, MAIL
是值。我的dillema是数值的数据结构。
将其存储在HashMap
中,其中每个行标题都是关键是浪费空间,因为行标题对于每一行完全相同。将其存储为数组会丢失每个项目的元数据,因为读者
我在考虑两种方法:
重载Java的Hashmap。行标题将存储一次,每个ID
将与字符串数组相关联。 get()
方法将被重载,以便它将在标题行和行中相应字段之间返回一个映射。
创建一个dumb类,使用getter和setter存储每行的数据(row.getMail()
,row.getAddress()
,...)
在内存效率,类型安全性和速度方面,正确的方法是什么?
答案 0 :(得分:2)
我会选择“哑”类,而不是重载一个集合。
我不知道类型安全或速度,但我会说你的代码会更具可读性。这些价值观在一起;将它们封装在一个对象中以强调这一点。除了获取/设置之外,是否还有与之相关的行为?如果是,那就更好了。
答案 1 :(得分:2)
虽然'哑'类是更清洁的方法,但它显然不如地图方法的通用,并且需要解析特定于CSV格式的逻辑 - 所以需要权衡。
可能更少的权衡是你对内存效率的担忧 - 字符串是interned所以每个行映射实际上都有相同的字符串实例,所以开销只会降到每个字符串的引用。
答案 2 :(得分:1)
如果您想知道一种提高效率的方法,可以使用Map<String, Integer>
组合查找密钥,并为每一行使用Object[]
。要按名称查找,您可以找到要先查找的号码。
更有效的方法是按列而不是按行存储数据。这更有效,因为您往往拥有比列更多的行
Map<String, List> columns = ...
您可以先按名称查找单元格,然后按列表中的条目查找。如果您想使用原始类型,可以使用int[]
或double[]
或TIntArrayList
和TDoubleArrayList
来节省内存。 ADDRESS
国家/地区可以是枚举类型。
除非你有数百万行,否则我会保持简单。