Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/286.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 点列表+构造函数和方法问题_Java_Arraylist - Fatal编程技术网

Java 点列表+构造函数和方法问题

Java 点列表+构造函数和方法问题,java,arraylist,Java,Arraylist,因此,对于这个项目,我希望输入一个包含多个点的数组。没有具体数字。我对应该如何处理方法和构造函数感到困惑,因为有些方法需要更改,例如获取X或Y值的平均值。我是否以正确的方式处理这个项目?我应该使用点列表的克隆,还是数组列表或其他什么。。。注:我仅以PolygonImpl类的一部分为例,它们的功能类似于类点所包含的: public class Point { private double x; private double y; public Point(double x, double y)

因此,对于这个项目,我希望输入一个包含多个点的数组。没有具体数字。我对应该如何处理方法和构造函数感到困惑,因为有些方法需要更改,例如获取X或Y值的平均值。我是否以正确的方式处理这个项目?我应该使用点列表的克隆,还是数组列表或其他什么。。。注:我仅以PolygonImpl类的一部分为例,它们的功能类似于类点所包含的:

public class Point {

private double x;
private double y;

public Point(double x, double y) {
    this.x = x;
    this.y = y;
}

public double getX() {
    return x;
}

public double getY() {
    return y;
}

public Point translate(double dx, double dy) {
    return new Point(x+dx, y+dy);
}

public double distanceTo(Point p) {
    return Math.sqrt((p.x - x)*(p.x -x) + (p.y-y)*(p.y-y));
}
}


在这种情况下,我认为您不需要额外的列表对象;它们是多余的。 下面是仅使用pList数组的代码

public class PolygonImpl implements Polygon {

private double xSum=0;
private double ySum=0;
private Point[] pList;
private Point a;

    PolygonImpl(Point[] pList) {

        this.pList = pList.clone();

        for (int index = 0; index < pList.length; index++) {
           xSum += pList[index].getX();
           ySum += pList[index].getY();
        }
    }



    public Point getVertexAverage() {
         double xSum = 0;
         double ySum = 0;
        for (int index = 0; index < pList.length; index++) {
             xSum = xSum + pList[index].getX();
             ySum = ySum + pList[index].getY();
            }

        return new Point(xSum/getNumSides(), ySum/getNumSides());
    }

    public int getNumSides() {
        return pList.length;
    }

    public void move(Point c) {
        Point newCentroid = new Point(a.getX()+ c.getX(), a.getY() +c.getY());


    }

    public void scale(double factor) {
        for (int index = 0; index < pList.length; index++)
        {
            double x = pList[index].getX() *factor;
            double y = pList[index].getY() * factor;
            Point a = new Point(x,y);
            pList[index] = a;

        }
    }

这里至少有三件事需要指出

第一个是克隆和复制之间的区别。克隆是浅拷贝;这意味着,如果更改克隆,也会更改原始版本

第二个是关于您对集合的使用。由于多边形是点的集合,因此数组或ArrayList都是合适的,但使用“麻烦”没有意义,或者,如果有,请仔细考虑它是否是一个好点,然后在内联文档中解释它的重要性,否则它会回来咬你,当你指的是另一个的时候,它会用一个咬你

三是范围。多边形类具有实例变量xSum和ySum,它们被getVertexAverage中同名的变量遮挡。它们在getVertexAverage中的使用方式本身就是合适的;实例变量仅在要缓存和的情况下才有用,这变得更加可疑,因为每次更改点的操作都会使实例值无效

实例值用于存储关于对象的数据在这种情况下,点是合理的;实例方法用于在给定状态下对该数据进行操作,在本例中为平均值


记住这一点,您现在可以理解move方法是如何没有完成的:

将pList用于scale方法会完全改变它吗?我担心如果我不使用另一个对象,它会对我的课程产生负面影响。我不知道你完全改变它或负面影响是什么意思。上面的代码将:遍历pList中的每个点;创建按因子缩放的新点对象;最后,用新点替换当前点。好的,我看到这个scale方法忘记了更新xSum和ySum。我相信,只需将它们乘以因子就可以做到这一点。如果我在构造函数中使用clone,我将如何在以下方法中正确使用它?我不太了解克隆操作。如果你不在乎你是在做浅拷贝,那么你就正确地使用了克隆。此对象将受益于求和方法,因为您可以在多个位置执行此操作。
public class PolygonImpl implements Polygon {

private double xSum=0;
private double ySum=0;
private Point[] pList;
private Point a;

    PolygonImpl(Point[] pList) {

        this.pList = pList.clone();

        for (int index = 0; index < pList.length; index++) {
           xSum += pList[index].getX();
           ySum += pList[index].getY();
        }
    }



    public Point getVertexAverage() {
         double xSum = 0;
         double ySum = 0;
        for (int index = 0; index < pList.length; index++) {
             xSum = xSum + pList[index].getX();
             ySum = ySum + pList[index].getY();
            }

        return new Point(xSum/getNumSides(), ySum/getNumSides());
    }

    public int getNumSides() {
        return pList.length;
    }

    public void move(Point c) {
        Point newCentroid = new Point(a.getX()+ c.getX(), a.getY() +c.getY());


    }

    public void scale(double factor) {
        for (int index = 0; index < pList.length; index++)
        {
            double x = pList[index].getX() *factor;
            double y = pList[index].getY() * factor;
            Point a = new Point(x,y);
            pList[index] = a;

        }
    }