我有一个简单的问题,我正在开发一个项目,需要一个具有id和x,y坐标的对象。这都存储在一个对象中,其想法是将它放入一个2D数组中。但是,有可能创建和存储大量对象,并且阵列的大小可能很大。是否存在可以存储数据的大小和速度更高效的东西?我读到使用地图可能这是我最好的选择。
答案 0 :(得分:5)
答案取决于您的应用程序的主要访问模式。
如果主要访问模式在特定的x,y坐标处查找对象,那么您可能最好通过以下方式之一服务:
Thing[][]
,Map<Point, Thing>
或Map<Integer, Map<Integer, Thing>>
。(我建议使用第3个选项,因为每次对数据结构进行查找时,第二个选项都会导致创建临时Point
对象。还有其他方法可以解决这个问题,但是它使应用程序更加复杂。)
如果2D阵列是稀疏填充的,那么Map方法将节省空间,但需要花费时间。如果阵列密集,那么Map方法可能比2D阵列使用更多空间。
如果主要访问模式是在给定的x,y坐标(或区域)附近查找对象,那么您可能需要类似四叉树数据结构的东西。
最后要注意的是,使用标准集合类型时会产生不可避免的开销,尤其是当一个或多个参数类型是基本类型时。 如果您的性能要求特别“难”,那么手动设计和实现自定义数据结构将节省空间和时间......如果您做得对。但缺点是您需要编写,测试和维护的代码要多得多,并且自定义数据结构与标准集合API不兼容。
答案 1 :(得分:2)
Map<Double, java.awt.Point>
java.awt.Point可以工作,或者您可以创建自己的数据类型来保存x,y坐标。
这将为您提供快速查找但使用比直接数组更多的内存(不确定多少,可能不是太糟糕)。
另一种选择是结合三件事(ID,x,y)并将它们存储在一个数组中然后使用Arrays.binarySearch来获取它们。它需要对数组进行排序。
编辑:
如果你想从x,y映射到你想做的双倍:
Map<java.awt.Point, Double>