在Java中向ArrayList添加和到达元素的问题

时间:2019-01-04 19:51:44

标签: java arraylist

我正在研究2D图形最佳拟合项目。我当时使用C ++进行编程,后来改用Java,因此我知道该算法有效。但是我遇到了超出循环范围或更可能添加到ArrayList的范围之外的ArrayList元素的问题。

我可以在此范围内找到所需的元素,但是在此范围之外,某些元素丢失了。我知道这是无关紧要的,可能发生了超出我注意力范围的事情。

三角类:

public class Triangle implements Shape, Cloneable
{
 private double length; // size of equaliteral triangle's each edge. 
 private double x,y;
 private boolean rotate; // Flag for rotate by 90 degress around pos(x,y)
 private boolean fill; // Flag for fill 
 private static double total_area = 0;
 private static double total_perim = 0;
 private int[] xPoints;
 private int[] yPoints;
 .
 ...
 }

定义:

 Triangle t2 = (Triangle)small;
 Triangle t = (Triangle)t2.clone();
 List<Shape> shape = new ArrayList<Shape>();

在下面的代码中,我将其添加到列表中后立即将其绘制。在这种情况下,方法draw()无关紧要,它仅使用x和y之类的字段。

代码1:

// (a,width-a*sqrt(3)) init for fill inside without rotating  
    for(y = r1.getHeight()-tri_height;y>=0;y-=tri_height)
    {
        x=t.getLength()/2.0;
        while(x+t.getLength()/2.0<=r1.getWidth())
        {
            t.setPosition(x+_x,y+_y);
            shape.add((Triangle)t.clone());
            shape.get(size).draw(g); // check this line.
            ++size;
            x+=t.getLength();
        }
    }

在同一段代码中,我仅在插入完成后绘制/打印它们。

代码2:

// (a,width-a*sqrt(3)) init for fill inside without rotating  
    for(y = r1.getHeight()-tri_height;y>=0;y-=tri_height)
    {
        x=t.getLength()/2.0;
        while(x+t.getLength()/2.0<=r1.getWidth())
        {
            t.setPosition(x+_x,y+_y);
            shape.add((Triangle)t.clone());
            x+=t.getLength();
        }

    }

    for(Shape s:shape)
        s.draw(g);

clone()方法:

@Override
public Object clone() throws CloneNotSupportedException
{
    return super.clone();
}

Output 1(Wrong)

Output 2(Expected)

我只使用draw()方法来更好地显示差异。问题在于元素不在范围之内。或者我没有正确添加它们。它向我显示了我添加的最后一个元素,而不是我添加的每个元素。在这种情况下我想念什么?

1 个答案:

答案 0 :(得分:2)

看来您的问题出在Triangle.clone()方法中。您在Triangle中有引用,例如int[] xPointsint[] yPoints

Object.clone()的默认实现仅适用于简单类型,而不适用于引用。

Triangle t = (Triangle)t2.clone();
t.xPoints == t2.xPoints;  // this is same array (not a copy)

您所有的矩形都绘制在同一位置

如何解决

请勿使用clone()方法。一般来说,它已经过时了。您必须像C++ copy constructor一样创建并手动创建对象的副本。

public class Triangle implements Shape {
    private static double total_area = 0;
    private static double total_perim = 0;

    private double length;
    private double x,y;
    private boolean rotate;
    private boolean fill;

    private int[] xPoints;
    private int[] yPoints;

    public Triangle(Triangle triangle) {
        this.length = triangle.length;
        this.x = triangle.x;
        this.y = triangle.y;
        this.rotate = triangle.rotate;
        this.fill = triangle.fill;

        this.xPoints = xPoints != null ? Arrays.copyOf(xPoints, xPoints.length) : null;
        this.yPoints = yPoints != null ? Arrays.copyOf(yPoints, yPoints.length) : null;
    }
 }

PS

int[] xPointsxPoints-不是数组,而是对int数组的引用。

int[] xPointsCopy = xPointsxPointsCopy-这是对int相同数组的另一种引用。