表达式的类型必须是数组类型,但它被解析为ArrayList <point2d.double> </point2d.double>

时间:2014-02-20 01:27:22

标签: java arraylist

我试图找出从area方法调用数组的正确方法,然后应该计算给定点的面积。不确定从每个数组中选择特定x和y坐标的正确方法是什么。

MyPolygon类

  import java.util.ArrayList;
import java.awt.geom.Point2D;
import java.awt.geom.Point2D.Double;

/**
 * A class that represents a geometric polygon. Methods are provided for adding
 * a point to the polygon and for calculating the perimeter and area of the
 * polygon.
 */
class MyPolygon {

    // list of the points of the polygon
    private ArrayList<Point2D.Double> points;

    /**
     * Constructs a polygon with no points in it.
     */
    public MyPolygon() {
        points = new ArrayList<Point2D.Double>();
    }

    /**
     * Adds a point to the end of the list of points in the polygon.
     * 
     * @param x
     *            The x coordinate of the point.
     * @param y
     *            The y coordinate of the point.
     */
    public void add(double x, double y) {
        points.add(new Point2D.Double(x, y));
    }

    /**
     * Calculates and returns the perimeter of the polygon.
     * 
     * @return 0.0 if < 2 points in polygon, otherwise returns the sum of the
     *         lengths of the line segments.
     */
    public double perimeter() {

        if (points.size() < 2) {
            return 0.0;
        }

        int i = 0;
        double d = 0;
        double total = points.get(0).distance(points.get(points.size() - 1));

        while (i < points.size() - 1) {
            Point2D.Double point1 = points.get(i);
            // double x = point1.x;
            // double y = point1.y;
            Point2D.Double point2 = points.get(i + 1);
            // double x1 = point2.x;
            // double y1 = point2.y;

            d = point1.distance(point2);
            // d = Math.sqrt(Math.pow(x1 - x,2) + Math.pow(y1 - y, 2));

            total = total + d;
            i++;

        }
        return total;

    }

    /**
     * Calculates and returns the area of the polygon.
     * 
     * @return 0.0 if < 3 points in the polygon, otherwise returns the area of
     *         the polygon.
     */
    public double area() {

        int i = 0;
        double a = 0;
        double total = 0;
        total = total + a;

        if (points.size() < 3) {
            return 0.0;
        }

        for (int m = 0; m < points.size(); m++) {

            total = total + (points[m].x() * points[m + 1].y()) - (points[m].y() * points[m + 1].x());
        }
        return 0.5 * total;
    }

}

Tester Class

class PolygonTester {

    public static void main(String args[]) {
        MyPolygon poly = new MyPolygon();
        poly.add(1.0,1.0);
        poly.add(3.0,1.0);
        poly.add(1.0,3.0);
        System.out.println(poly.perimeter());
        System.out.println(poly.area());
    }

}

4 个答案:

答案 0 :(得分:1)

您的标题实际上已经是解决方案了。您使用points[m]这是数组表示法。但points不是数组。这是一个清单。请改用points.get(int i),就像在perimeter()中一样。

答案 1 :(得分:0)

你将在列表上用完界限。你的for循环继续,而m <尺寸()。但是,您在计算中访问m + 1。因此,如果列表包含5个元素并且m = 4,(4&lt; 5)因此保持循环,则您将访问m + 1,即5。由于这些列表基于0,因此没有索引5。 / p>

此外,代码可能没有编译,因为您使用数组语法来访问列表。你应该说points.get(m)

答案 2 :(得分:0)

解决方案非常简单,并且由您的标题(我认为是编译器错误)给出。

您将points视为数组,而不是。您访问ArrayList的元素的方式稍有不同:您使用的是points.get(m)而不是points[m]。如果您在area中进行了更改,则会有效。

答案 3 :(得分:0)

ArrayLists不是数组。它们是使用get(int)方法编制索引的对象 无论您拥有points[m]或类似内容,请将其替换为points.get(m)。这条线将成为:

total = total + (points.get(m).x() * points.get(m + 1).y()) - (points.get(m).y() * points.get(m + 1).x());

这应该可以解决这个问题,但是你仍然可能在循环的最后一次迭代中获得IndexOutOfBoundsException,因为当m是最后一个索引时,你将尝试索引m + 1。您应该根据您希望它处理最后一个元素的方式来更改代码。