什么是稀疏Java 2D阵列的记忆意识替代品?

时间:2017-08-28 13:30:28

标签: java multidimensional-array data-structures

在Java中,具有稀疏内容的大型2D数组相当于内存效率低,因为它占用了连续的内存块,而不管实际存储在哪个数据中。

我正在寻找一种替代数据结构,它可以以类似网格的方式保存元素。我希望内存效率为O(n),其中n是结构中实际数据元素的数量。

干杯!

2 个答案:

答案 0 :(得分:2)

您可以使用HashMap,其中键包含X和Y位置。如果你不想为Map的键实现一个新类,你可以使用“X_Y”形式的字符串,其中X是第一个维度的索引,Y是第二个维度的索引。

Map<String, YourClass> map = new HashMap<>();

要将项目放在位置2345,6789,您可以这样做:

map.put(2345 + "_" + 6789, yourObject);

并将其取回:

YourClass yourObject = map.get(2345 + "_" + 6789);

为什么选择这种方法而不是使用某种元组?我认为简短的回答是Java不带有Tuple或Pair类。您可以自己编写并添加自己的hashCode()和equals()实现,也可以使用Map.Entry<K, V>之类的东西。无论是为键选择字符串还是为键选择类,都不会对执行时间产生显着影响。你通过使用String来放弃某种类型的安全性,并且你可以通过一些简洁的代码来弥补这一点。

答案 1 :(得分:2)

尝试元组的地图或字典(X,Y)

如果你想要线性范围访问(对于所有X给我的Ys范围),那么用树实现的容器仍然可以正常工作。哈希表适合随机访问。

也可以尝试SparseArray

无论您选择什么,请务必:

  1. 了解潜在的实施,尽管可能 可能会随着时间而改变
  2. 测量和比较
  3. 测量通常胜过理论化