繁体   English   中英

矩形列表的并集

[英]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.unionRectangle.add都给出相同的结果(见输出)

  • 我将从一个等于rects的第一个元素的新Rectangle开始,然后使用它来计算与以下元素的联合(或者,等效地,添加以下元素)。

我希望这有帮助。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM