【发布时间】:2011-08-23 17:49:57
【问题描述】:
我有一个简单的问题,我正在开展一个项目,该项目需要一个具有 id 和 x、y 坐标的对象。这一切都存储在一个对象中,其想法是将其放置在一个二维数组中。但是,可能会创建和存储大量对象,并且数组的大小可能很大。在存储数据的大小和速度上是否有更有效的方法?我阅读了有关使用地图的信息,这可能是我最好的选择。
【问题讨论】:
标签: java arrays multidimensional-array performance 2d
我有一个简单的问题,我正在开展一个项目,该项目需要一个具有 id 和 x、y 坐标的对象。这一切都存储在一个对象中,其想法是将其放置在一个二维数组中。但是,可能会创建和存储大量对象,并且数组的大小可能很大。在存储数据的大小和速度上是否有更有效的方法?我阅读了有关使用地图的信息,这可能是我最好的选择。
【问题讨论】:
标签: java arrays multidimensional-array performance 2d
答案取决于您的应用程序的主要访问模式是什么。
如果主要访问模式是在特定的 x,y 坐标处查找对象,那么最好使用以下方法之一:
Thing[][], Map<Point, Thing>,或Map<Integer, Map<Integer, Thing>>。(我建议第三种选择,因为第二种选择可能会导致在您每次查找数据结构时创建一个临时的Point 对象。还有其他方法可以解决这个问题,但它使应用程序更复杂。)
如果 2D 数组是稀疏填充的,那么 Map 方法将以时间为代价节省空间。如果数组密集填充,则 Map 方法可能比二维数组使用 更多 空间。
如果主要访问模式是在给定的 x,y 坐标附近(或在一个区域中)寻找对象,那么您可能需要类似四叉树数据结构的东西。
最后要注意的一点是,使用标准集合类型存在不可避免的开销,尤其是当一个或多个参数类型是原始类型时。
如果您的性能要求特别“硬”,那么手动设计和实现自定义数据结构将节省空间和时间……如果您做得对。但缺点是要编写、测试和维护的代码要多得多,而且自定义数据结构与标准集合 API 不兼容。
【讨论】:
Map<Double, java.awt.Point>
java.awt.Point 可以工作,或者您可以创建自己的数据类型来保存 x、y 坐标。
这将使您快速查找,但使用比直接数组更多的内存(不确定更多,可能不会太糟糕)。
另一种选择是将这三个东西(ID、x、y)结合起来并将它们存储在一个数组中,然后使用Arrays.binarySearch 来获取它们。它需要对数组进行排序。
编辑:
如果你想从 x, y 映射到你会做的双精度:
Map<java.awt.Point, Double>
【讨论】:
Double(或 String),而不是相反。