矩形列表的联合

时间:2011-05-04 08:34:12

标签: java union awt

我有一个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中有更优雅的方法吗?

3 个答案:

答案 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.unionRectangle.add都会得到相同的结果(参见输出)

  • 我会从一个等待Rectangle的第一个元素的新rects开始,然后使用它来计算与以下元素的并集(或者等效地添加以下元素)

我希望这会有所帮助。