【发布时间】:2011-01-16 07:36:03
【问题描述】:
问题
我有一个java.awt.Rectangles 数组。对于不熟悉这个类的人来说,重要的信息是它们提供了一个.intersects(Rectangle b) 函数。
我想编写一个函数,接收这个Rectangles 数组,并将其分解为相连的矩形组。
比如说,这些是我的矩形(构造函数接受参数x、y、width、height):
Rectangle[] rects = new Rectangle[]
{
new Rectangle(0, 0, 4, 2), //A
new Rectangle(1, 1, 2, 4), //B
new Rectangle(0, 4, 8, 2), //C
new Rectangle(6, 0, 2, 2) //D
}
快速绘图显示 A 与 B 相交, B 与 C 相交。 D 与任何东西都不相交。一幅乏味的 ascii 艺术作品也可以完成这项工作:
┌───────┐ ╔═══╗
│A╔═══╗ │ ║ D ║
└─╫───╫─┘ ╚═══╝
║ B ║
┌─╫───╫─────────┐
│ ╚═══╝ C │
└───────────────┘
因此,我的函数的输出应该是:
new Rectangle[][]{
new Rectangle[] {A,B,C},
new Rectangle[] {D}
}
失败的代码
这是我解决问题的尝试:
public List<Rectangle> getIntersections(ArrayList<Rectangle> list, Rectangle r)
{
List<Rectangle> intersections = new ArrayList<Rectangle>();
for(Rectangle rect : list)
{
if(r.intersects(rect))
{
list.remove(rect);
intersections.add(rect);
intersections.addAll(getIntersections(list, rect));
}
}
return intersections;
}
public List<List<Rectangle>> mergeIntersectingRects(Rectangle... rectArray)
{
List<Rectangle> allRects = new ArrayList<Rectangle>(rectArray);
List<List<Rectangle>> groups = new ArrayList<ArrayList<Rectangle>>();
for(Rectangle rect : allRects)
{
allRects.remove(rect);
ArrayList<Rectangle> group = getIntersections(allRects, rect);
group.add(rect);
groups.add(group);
}
return groups;
}
不幸的是,这里似乎有一个无限递归循环。我没有受过教育的猜测是 java 不喜欢我这样做:
for(Rectangle rect : allRects)
{
allRects.remove(rect);
//...
}
谁能解释一下这个问题?
【问题讨论】:
-
快速抛开:通常建议您将列表变量声明为
List类型,并且仅当您实际创建一个全新的列表时才需要指明类型(ArrayList 或 LinkedList 或其他可能是)。 -
谢谢。我已经更改了代码以反映这一点。
-
这不会发生在 CodeJam 第 2 轮的问题 C 中吗? :)
-
来自今年的 Google Code Jam?我不这么认为。查看问题的原始日期。
标签: java algorithm recursion geometry arraylist