Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/389.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 存储对象以按x、y坐标定位_Java_Tree_Spatial_Quadtree - Fatal编程技术网

Java 存储对象以按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

我正在尝试确定一种快速存储一组对象的方法,每个对象都有一个x和y坐标值,这样我就可以快速检索某个矩形或圆形内的所有对象。 对于小型对象集(~100),简单地将它们存储在列表中并在其中迭代的简单方法相对较快。然而,对于规模更大的群体来说,这显然是缓慢的。 我也尝试将它们存储在一对树形图中,一个按x坐标排序,一个按y坐标排序,使用以下代码:

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)

如果您处理的是连续平面上的点而不是几个离散点,则可以通过使用特定大小的“桶”来改进这一点。不如四叉树好,但实现起来更简单。