在Java中,具有稀疏内容的大型2D数组相当于内存效率低,因为它占用了连续的内存块,而不管实际存储在哪个数据中。
我正在寻找一种替代数据结构,它可以以类似网格的方式保存元素。我希望内存效率为O(n),其中n是结构中实际数据元素的数量。
干杯!
答案 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
无论您选择什么,请务必:
测量通常胜过理论化