我有一个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中有更优雅的方法吗?
答案 0 :(得分:0)
在第二个示例中,您需要像这样初始化result
:
Rectangle result = new Rectangle(-1, -1);
请注意,这仅适用于Java SE 6.在以前的版本中,关于负宽度和高度的行为是未定义的。有关一组点的类似示例,请参阅Javadoc entry for Rectangle
。
答案 1 :(得分:0)
根据随附的javadoc,您的基于add
的人应该可以使用。它说:
向此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;
}
答案 2 :(得分:0)
我认为您的解决方案并不差。我将如何做到这一点:
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;
}
输出
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
都会得到相同的结果(参见输出)
我会从一个等待Rectangle
的第一个元素的新rects
开始,然后使用它来计算与以下元素的并集(或者等效地添加以下元素)
我希望这会有所帮助。