【发布时间】:2015-06-17 07:06:47
【问题描述】:
所以我正在处理一个问题,我将一个大型文本文件解析为数据 - 文件的每一行都由具有多个数据字段的 Node 对象表示。
在程序执行期间,这些对象将根据它们的int id字段(在文本文档中指定)被访问多次。
如果每个id 都存在,我只需将它们存储为Node[] 数组,并且想要使用id x 访问节点,我只需使用nodeArray[x]。
但是,数据表明id 的大多数值都不存在。对于我当前的数据集,在集合中介于 0 和最大 id、ID_MAX 之间的 id 中只有大约 40-50% 存在于集合中。
在我看来,我有两个选择:
使用包含许多未填充条目的大 Node[],如
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 的节点变得微不足道,但在数据集很大的情况下会使用大量额外空间。
另一种选择是使用较小的 Node[] 数组并使用稀疏的 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++;
}
两者中的任何一个总体上是否比另一个更好,还是取决于数据的大小和稀疏性? 有没有比这两种方法更好的方法?
【问题讨论】:
-
你可以使用 Map