点数的ArrayList中的段长度--Java

时间:2013-05-22 19:02:27

标签: java point indexoutofboundsexception

我正在尝试从我创建的arrayList计算线段(长度)。 这是在JAVA。一切都按照我想要的方式运作,但是我得到了这样的信息: “线程中的异常”主“java.lang.IndexOutOfBoundsException:索引:2,大小:2     在java.util.ArrayList.rangeCheck(未知来源)     at java.util.ArrayList.get(Unknown Source)     “

对于arraylist的索引具有“+1”会引起麻烦。这是导致错误消息的原因,但它确实计算了线段。它打印它们然后打印可怕的错误语句。

myPoints.get((i + 1))。x; < ---(i + 1)造成麻烦 tempYFirst = myPoints.get(i).y; < ---没有+1就能正常工作,但它不能做我想做的事。

public static void showStats(ArrayList<Point> myPoints)
{
    double distance = 0.0;
    double length;
    double tempX;
    double tempY;
    double tempX2;
    double tempY2;
    int tempFirst;
    int tempSecond;
    int tempYFirst;
    int tempYSecond;
    int xValue;
    int yValue;


    // Line segments are calculated by the distance formula of:
    // Sqrt ( (x2-x1)^2 + (y2-y2)^2)
    for (int i = 0; i < myPoints.size(); i++) {

        tempFirst = myPoints.get(i).x;
        tempSecond = myPoints.get((i+1)).x ;
        tempYFirst = myPoints.get(i).y;
        tempYSecond = myPoints.get((i+1)).y;

        xValue = tempFirst - tempSecond;
        yValue = tempYFirst - tempYSecond;

        tempX2 = Math.pow(xValue, 2);
        tempY2 = Math.pow(yValue, 2);

        distance += Math.sqrt((tempX2 + tempY2));

        System.out.println(tempSecond);
     }// /
}

3 个答案:

答案 0 :(得分:2)

您正试图获取索引2处的Point,但只有2个点,而Java索引中只有0size - 11在这种情况下。问题是这一行

tempSecond = myPoints.get((i+1)).x ;

i为1时,i + 12且超出范围。在上一个Point时,最好与第一个Point进行比较以完成循环:

tempSecond = myPoints.get((i+1) % myPoints.size()).x ;

这使用%模运算符在除以myPoints.size()时得到余数,这样当i + 1变得太大时,0就是结果,即余数将size除以size0

答案 1 :(得分:1)

尝试以1开始循环。这样你就不会遇到索引越界的问题......

for (int i = 1; i < myPoints.size(); i++) {

    tempFirst = myPoints.get(i-1).x;
    tempSecond = myPoints.get((i)).x ;
    tempYFirst = myPoints.get(i-1).y;
    tempYSecond = myPoints.get((i)).y;

    xValue = tempFirst - tempSecond;
    yValue = tempYFirst - tempYSecond;

    tempX2 = Math.pow(xValue, 2);
    tempY2 = Math.pow(yValue, 2);

    distance += Math.sqrt((tempX2 + tempY2));

    System.out.println(tempSecond);
 }

答案 2 :(得分:0)

除了@ rgettman的回答之外,请尝试使用内置的Point2D.distance方法,如下所示:

public static void showStats(ArrayList<Point> myPoints) {
    double distance = 0.0;
    for (int i = 0; i < myPoints.size(); i++) {
        Point first = myPoints.get(i);
        Point second = myPoints.get((i+1) % myPoints.size());
        // use distance method
        distance += first.distance(second);
        System.out.println(second.x);
     }
}