如何在java中有效地访问半稀疏数据?

时间:2015-06-17 07:06:48

标签: java arrays indexing

所以我正处理一个问题,我将一个大文本文件解析为数据 - 文件的每一行都由一个Node对象表示,并带有多个数据字段。

在程序执行期间,将根据int id字段(在文本文档中指定)多次访问这些对象。

如果每个id都存在,我只会将它们存储为Node[]数组,并希望使用id x访问该节点,我只需使用nodeArray[x]

然而,数据是id的大多数值都不存在。对于我当前的数据集,集合中只有大约40-50%的id介于0和最大idID_MAX之间。< / p>

我看到它的方式,我有两个选择:

使用包含许多未填充条目的大型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++;
}

两者中的任何一个通常比另一个更好还是取决于数据的大小和稀疏性? 还有另外一种方法我认为这比两者中任何一种都好吗?

1 个答案:

答案 0 :(得分:2)

根据您在此处描述的内容,您可以使用HashMap<Integer, Node>HashMap<Long, Node>,具体取决于您拥有的ID范围。

根据您的其他要求LinkedHashMapTreeMap可能是替代方案(LinkedHashMap,如果您需要按照插入顺序迭代节点,TreeMap你需要按照某些标准对它们进行分类。)