Java 存储对象以按x、y坐标定位
我正在尝试确定一种快速存储一组对象的方法,每个对象都有一个x和y坐标值,这样我就可以快速检索某个矩形或圆形内的所有对象。 对于小型对象集(~100),简单地将它们存储在列表中并在其中迭代的简单方法相对较快。然而,对于规模更大的群体来说,这显然是缓慢的。 我也尝试将它们存储在一对树形图中,一个按x坐标排序,一个按y坐标排序,使用以下代码:Java 存储对象以按x、y坐标定位,java,tree,spatial,quadtree,Java,Tree,Spatial,Quadtree,我正在尝试确定一种快速存储一组对象的方法,每个对象都有一个x和y坐标值,这样我就可以快速检索某个矩形或圆形内的所有对象。 对于小型对象集(~100),简单地将它们存储在列表中并在其中迭代的简单方法相对较快。然而,对于规模更大的群体来说,这显然是缓慢的。 我也尝试将它们存储在一对树形图中,一个按x坐标排序,一个按y坐标排序,使用以下代码: xSubset = objectsByX.subSet( minX, maxX ); ySubset = objectsByY.subSet( minY, ma
xSubset = objectsByX.subSet( minX, maxX );
ySubset = objectsByY.subSet( minY, maxY );
result.addAll( xSubset );
result.retainAll( ySubset );
这同样有效,对于较大的对象集速度更快,但仍然比我希望的慢。
部分问题还在于,这些对象会四处移动,需要重新插入到该存储中,这意味着将它们从树/列表中删除并重新添加到树/列表中。
我忍不住认为一定有更好的解决办法。
我正在用Java实现它,如果它有什么不同的话,尽管我希望任何解决方案都会更多地以一种有用的模式/算法的形式出现。是常用的解决方案。请看一看。通用术语是一个。我想你应该根据答案来选择。似乎解决了我问的具体问题。是一种更一般的形式,适用于任意数量的维度,而不仅仅是两个维度
如果存储的对象具有一个边界矩形,而不仅仅是一个简单的点,则可能也很有用
此类结构的一般术语为
有一个和的Java实现。您可以将所有x线放在一个映射中,将y线放在另一个映射中,并使映射值指向该对象
TreeMap<Integer, TreeMap<Integer, Point>> xMap = new TreeMap<Integer, TreeMap<Integer, Point>>();
for (int x = 1; x < 100; x += 2)
for (int y = 0; y < 100; y += 2)
{
Point p = new Point(x, y);
TreeMap<Integer, Point> tempx = xMap.get(x);
if (tempx == null)
{
tempx = new TreeMap<Integer, Point>();
xMap.put(x, tempx);
}
tempx.put(y, p);
}
SortedMap<Integer, TreeMap<Integer, Point>> tempq = xMap.subMap(5, 8);
Collection<Point> result = new HashSet<Point>();
for (TreeMap<Integer, Point> smaller : tempq.values())
{
SortedMap<Integer, Point> smallerYet = smaller.subMap(6, 12);
result.addAll(smallerYet.values());
}
for (Point q : result)
{
System.out.println(q);
}
}
TreeMap xMap=newtreemap();
对于(int x=1;x<100;x+=2)
对于(int y=0;y<100;y+=2)
{
点p=新点(x,y);
TreeMap tempx=xMap.get(x);
if(tempx==null)
{
tempx=新树映射();
xMap.put(x,tempx);
}
tempx.put(y,p);
}
SortedMap tempq=xMap.subMap(5,8);
收集结果=新的HashSet();
对于(树映射较小:tempq.values())
{
SortedMap smallerYet=较小的子映射(6,12);
result.addAll(smallerYet.values());
}
对于(q点:结果)
{
系统输出println(q);
}
}
C#中的简单四叉树实现(易于翻译成java)
如果您处理的是连续平面上的点而不是几个离散点,则可以通过使用特定大小的“桶”来改进这一点。不如四叉树好,但实现起来更简单。