【发布时间】:2016-01-16 20:07:18
【问题描述】:
我有一个矩形列表,以通常的方式创建:
List<Rectangle> rects = new ArrayList<>();
添加了一些矩形(所有矩形的宽度和高度都非零)。 List 包含的 Rectangles 的数量可以在 0 到 10,000 之间,通常在 4,000 到 6,000 之间。
列表按矩形原点的 X 坐标升序排序,然后对重复的 X 坐标按 Y 坐标升序排序(尽管很少有两个或多个具有相同 X 坐标的矩形)。
我已验证排序正确完成(我正在使用带有自定义比较器的 Collections.sort)。
我需要一个将两个整数 x 和 y 作为输入的方法,并返回找到的第一个包含点 (x,y) 的 Rectangle,如果列表中没有包含该点的 Rectangle,则返回 null。
public Rectangle findContainingRectangle(int x, int y)
提供所需功能的简单方法是遍历列表并在每个 Rectangle 上调用 contains 方法,但这太慢了。
List 将在程序运行时被修改,但与需要搜索 List 的速度相比,这个速度是微不足道的,因此需要相对较慢的初始化的算法是可以的。
我查看了 Collections.binarySearch,但不知道如何使用它。我对 Java 没有太多经验,所以如果有另一个 Collection 可以与 List 类似地使用,但更适合我需要的搜索类型,那就太好了(我已经阅读了有关 Maps 和 Sets 之类的文档,但没有'不承认任何优势)。
【问题讨论】:
-
这似乎是一个解决方案:stackoverflow.com/questions/10269179/…
-
谢谢。我的情况有点“简单”,因为我只需要返回一个包含 Rectangle 的内容,但 R-tree 可能仍然是一个解决方案。
标签: java algorithm search 2d sortedlist