Java:具有相同键的地图地图

时间:2012-03-05 10:37:48

标签: java data-structures dictionary nested hashtable

考虑一个具有以下结构的巨大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(),...)

在内存效率,类型安全性和速度方面,正确的方法是什么?

3 个答案:

答案 0 :(得分:2)

我会选择“哑”类,而不是重载一个集合。

我不知道类型安全或速度,但我会说你的代码会更具可读性。这些价值观在一起;将它们封装在一个对象中以强调这一点。除了获取/设置之外,是否还有与之相关的行为?如果是,那就更好了。

答案 1 :(得分:2)

虽然'哑'类是更清洁的方法,但它显然不如地图方法的通用,并且需要解析特定于CSV格式的逻辑 - 所以需要权衡。

可能更少的权衡是你对内存效率的担忧 - 字符串是interned所以每个行映射实际上都有相同的字符串实例,所以开销只会降到每个字符串的引用。

答案 2 :(得分:1)

除非你知道自己有问题,否则我不会担心浪费的空间。即你有很多GB数据。

如果您想知道一种提高效率的方法,可以使用Map<String, Integer>组合查找密钥,并为每一行使用Object[]。要按名称查找,您可以找到要先查找的号码。

更有效的方法是按列而不是按行存储数据。这更有效,因为您往往拥有比列更多的行

Map<String, List> columns = ...

您可以先按名称查找单元格,然后按列表中的条目查找。如果您想使用原始类型,可以使用int[]double[]TIntArrayListTDoubleArrayList来节省内存。 ADDRESS国家/地区可以是枚举类型。

除非你有数百万行,否则我会保持简单。