如何在java中高效地访问半稀疏数据?
因此,我正在处理一个问题,将一个大型文本文件解析为数据——文件的每一行都由一个包含多个数据字段的如何在java中高效地访问半稀疏数据?,java,arrays,indexing,Java,Arrays,Indexing,因此,我正在处理一个问题,将一个大型文本文件解析为数据——文件的每一行都由一个包含多个数据字段的节点对象表示 在程序执行期间,将根据其int id字段(在文本文档中指定)多次访问这些对象 如果每个id都存在,我只需将它们存储为Node[]数组,如果想要使用idx访问节点,我只需使用noderray[x] 但是,数据是这样的:id的大多数值都不存在。对于我当前的数据集,0到最大的id,id\u MAX之间的id中只有大约40-50%存在于数据集中 在我看来,我有两个选择: 使用带有许多未填充项的大
节点对象表示
在程序执行期间,将根据其int id
字段(在文本文档中指定)多次访问这些对象
如果每个id
都存在,我只需将它们存储为Node[]
数组,如果想要使用id
x访问节点,我只需使用noderray[x]
但是,数据是这样的:id
的大多数值都不存在。对于我当前的数据集,0到最大的id
,id\u MAX
之间的id
中只有大约40-50%存在于数据集中
在我看来,我有两个选择:
使用带有许多未填充项的大型节点[]
,如中所示
Node[] nodeArray = new Node[ID_MAX];
BufferedReader br = new BufferedReader(new FileReader(file));
String line;
while((line = br.readLine()) != null) {
Node n = ... // parse line of text into Node object
nodeArray[n.getID()] = n;
end
br.close();
这将使使用特定id访问节点变得微不足道,但在数据集较大的情况下会占用大量额外空间
另一种选择是使用较小的节点[]
数组,并使用稀疏的int[]
数组进行索引:
Node[] nodeArray = new Node[NUM_ROWS];
int[] indexArray = new Int[ID_MAX];
BufferedReader br = new BufferedReader(new FileReader(file));
String line;
int i = 0;
while((line = br.readLine()) != null) {
Node n = ... // parse line of text into Node object
nodeArray[i] = n;
indexArray[n.id] = i;
i++;
}
这两者中的任何一个总体上比另一个好,还是取决于数据的大小和稀疏性?
有没有其他我没有考虑过的方法比这两种方法更好?根据您在这里描述的内容,您可以使用HashMap
或HashMap
,具体取决于您拥有的ID范围
根据您的其他要求,LinkedHashMap
和TreeMap
可能是备选方案(LinkedHashMap
如果需要按插入顺序遍历节点,如果需要按某些标准对节点进行排序).如果需要按照节点插入的顺序插入节点,则可以使用MAPI,因为您不知道它们是如何插入的。我更愿意说“如果您需要按照节点插入的顺序迭代节点”(顺便说一句,如果您需要迭代节点,这不是映射的标准用例)。除此之外,这正是我要回答的问题,你抢先回答了;-)您还可以补充说,地图消除了知道ID\u MAX
@Joffrey your's right的约束。我已经在LinkedHashMap
上更新了我的答案以澄清问题,谢谢你的回答。映射似乎与我提出的第二个解决方案非常相似(尽管int[]
数组中没有空值)。使用map是否会带来很大的开销?作为旁注;节点不会按插入顺序迭代。一般来说,“附近”节点的访问频率要高于遥远的节点,但没有固定的模式。对于几乎任何应用程序来说,Map的任何实现的开销都不会是一个问题。我强烈建议您为类似的事情选择标准库解决方案。从长远来看,这会节省很多时间。