[英]Union of a list of rectangles
我有一个 AWT 矩形列表。 我想以一种优雅的方式计算矩形的并集。 这是我的代码,它有效但看起来不太优雅。
Rectangle union(List<Rectangle> rects) {
if (rects.isEmpty()) {
return new Rectangle();
}
assert !rects.isEmpty();
final Iterator<Rectangle> iterator = rects.iterator();
Rectangle rect = iterator.next();
while (iterator.hasNext()) {
rect = rect.union( iterator.next() );
}
return rect;
}
我还尝试了以下不起作用的方法:
Rectangle union(List<Rectangle> rects) {
Rectangle result = new Rectangle();
for (Rectangle rect : rects) {
result.add( rect );
}
return result;
}
矩形结果初始化为 (0,0,0,0),因此联合将始终包含原点。
在 Java 中有没有更优雅的方法来做到这一点?
在第二个示例中,您需要像这样初始化result
:
Rectangle result = new Rectangle(-1, -1);
请注意,这仅在 Java SE 6 之后才有效。在以前的版本中,关于负宽度和高度的行为是未定义的。 有关具有一组点的类似示例,请参阅Rectangle
的 Javadoc 条目。
根据随附的 javadoc,您的add
based 应该可以工作。 它说:
向此 Rectangle 添加一个 Rectangle。 生成的 Rectangle 是两个矩形的并集。
但它只有效,你初始化一个尺寸小于零的矩形。 这是方法2的工作解决方案:
Rectangle union(List<Rectangle> rects) {
Rectangle result = new Rectangle(-1,-1); // dimension less than 0
for (Rectangle rect : rects) {
result.add( rect );
}
return result;
}
备选方案:根据第一个列表项创建初始结果:
Rectangle union(List<Rectangle> rects) {
if (rects == null || rects.isEmpty()) return null;
Rectangle result = new Rectangle(rects.get(0));
for (Rectangle rect : rects) {
result.add( rect );
}
return result;
}
我认为您的解决方案还不错。 这是我的做法:
public static void main(String[] args) {
List<Rectangle> rects = new ArrayList<Rectangle>();
rects.add(new Rectangle(new Point(1, 1), new Dimension(3, 4)));
rects.add(new Rectangle(new Point(2, 2), new Dimension(5, 7)));
Rectangle u = union(rects);
Rectangle a = add(rects);
System.out.println(u);
System.out.println(a);
}
public static Rectangle union(List<Rectangle> rects) {
if (rects.isEmpty())
throw new IllegalArgumentException();
Rectangle unionRectangle = new Rectangle(rects.get(0));
for (int i = 1; i < rects.size(); i++)
unionRectangle = unionRectangle.union(rects.get(i));
return unionRectangle;
}
public static Rectangle add(List<Rectangle> rects) {
if (rects.isEmpty())
throw new IllegalArgumentException();
Rectangle unionRectangle = new Rectangle(rects.get(0));
for (int i = 1; i < rects.size(); i++)
unionRectangle.add(rects.get(i));
return unionRectangle;
}
Output 是
java.awt.Rectangle[x=1,y=1,width=6,height=8]
java.awt.Rectangle[x=1,y=1,width=6,height=8]
一些注意事项:
如果列表rects
为空,我会抛出异常而不是返回Rectangle
Rectangle.union
和Rectangle.add
都给出相同的结果(见输出)
我将从一个等于rects
的第一个元素的新Rectangle
开始,然后使用它来计算与以下元素的联合(或者,等效地,添加以下元素)。
我希望这有帮助。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.