Java:具有相同键的映射的映射

Java:具有相同键的映射的映射,java,data-structures,dictionary,nested,hashtable,Java,Data Structures,Dictionary,Nested,Hashtable,考虑具有以下结构的大型CSV(为简单起见进行了修改): 快速获取的自然数据结构是一个哈希表,其中每个ID都是一个键,名称、地址、电话、邮件都是值。我的难题是价值观的数据结构 将其存储在HashMap中,其中每一行头都是键,这是浪费空间,因为每一行的行头都完全相同。将其存储为数组将丢失每个项的元数据,因为读取器 我想到了两种方法: 重载Java的Hashmap。行标题将存储一次,并且每个ID将与字符串数组相关联。get()方法将被重载,以便返回标题行与行中相应字段之间的映射 创建一个哑类,该类使

考虑具有以下结构的大型CSV(为简单起见进行了修改):

快速获取的自然数据结构是一个哈希表,其中每个
ID
都是一个键,
名称、地址、电话、邮件
都是值。我的难题是价值观的数据结构

将其存储在
HashMap
中,其中每一行头都是键,这是浪费空间,因为每一行的行头都完全相同。将其存储为数组将丢失每个项的元数据,因为读取器

我想到了两种方法:

  • 重载Java的Hashmap。行标题将存储一次,并且每个
    ID
    将与字符串数组相关联。
    get()
    方法将被重载,以便返回标题行与行中相应字段之间的映射

  • 创建一个哑类,该类使用getter和setter(
    row.getMail()
    row.getAddress()
    ,…)存储每行的数据

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

我选择“dumb”类,而不是重载集合

我不知道类型安全性或速度,但我想说您的代码将更具可读性。这些价值观是相辅相成的;将它们封装在一个对象中以强调重点。除了get/set之外,还有其他与它们相关的行为吗?如果是,那就更好了。

我选择“dumb”类,而不是重载集合


我不知道类型安全性或速度,但我想说您的代码将更具可读性。这些价值观是相辅相成的;将它们封装在一个对象中以强调重点。除了get/set之外,还有其他与它们相关的行为吗?如果是的话,那就更好了。

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

如果您想知道一种更有效的方法,可以使用
Map
的组合来查找键,并对每一行使用
对象[]
。要按名称查找,请先查找要查找的编号

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

Map<String, List> columns = ...
映射列=。。。
可以先按名称,然后按列表中的条目查找单元格。如果要使用基本类型,可以使用
int[]
double[]
TIntArrayList
TDoubleArrayList
来节省内存。
地址
国家/地区可以是枚举类型


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

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

如果您想知道一种更有效的方法,可以使用
Map
的组合来查找键,并对每一行使用
对象[]
。要按名称查找,请先查找要查找的编号

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

Map<String, List> columns = ...
映射列=。。。
可以先按名称,然后按列表中的条目查找单元格。如果要使用基本类型,可以使用
int[]
double[]
TIntArrayList
TDoubleArrayList
来节省内存。
地址
国家/地区可以是枚举类型


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

虽然“dumb”类是更干净的方法,但它显然没有map of maps方法那么通用,并且需要特定于CSV格式的解析逻辑,因此需要权衡


可能不太需要权衡的是您对内存效率的关注-字符串是这样的,因此每个行映射中实际上都有相同的字符串实例,因此,开销将仅限于对每个字符串的引用。

虽然“dumb”类是更干净的方法,但它显然没有map of maps方法那么通用,并且需要特定于CSV格式的解析逻辑,因此需要权衡


可能不太需要权衡的是您对内存效率的担忧-字符串是这样的,因此每个行映射中实际上都有相同的字符串实例,因此开销将仅限于对每个字符串的引用。

我确实有数百万条记录。在这种情况下,值得测试的是,它是否会产生足够的影响(比我不担心的要小),您可能仍然会发现,虽然它可以节省100 MB的内存,但这只意味着您的服务器的可用内存将增加100 MB,但保持代码更简单实际上是一个更好的主意。我确实有数百万条记录。在这种情况下,这可能是值得测试的,它是否有足够的区别,重要的是(比我不想麻烦的少),你可能仍然会发现,虽然它节省了,比如说100 MB,这只意味着你的服务器的可用内存增加了100 MB,但保持代码更简单实际上是一个更好的主意。