Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/326.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在java中高效地访问半稀疏数据?_Java_Arrays_Indexing - Fatal编程技术网

如何在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的任何实现的开销都不会是一个问题。我强烈建议您为类似的事情选择标准库解决方案。从长远来看,这会节省很多时间。