如何成功遍历一个预填充的 ArrayList 来找到每个连续元素的差异并打印出来?

How do I successfully traverse a pre-filled ArrayList to find the difference of each consecutive element and print it out?

public class AccumulatedData {

    public static void main(String args[]) {

        ArrayList<Double> weights = new ArrayList<Double>();

        weights.add(145.0);
        weights.add(146.5);
        weights.add(146.5);
        weights.add(147.0);
        weights.add(146.0);
        weights.add(148.0);
        weights.add(148.5);

        ArrayList<Double> printWeightChanges = getWeightChanges(weights);
        System.out.println(weights);
    }

    public static ArrayList<Double> getWeightChanges(ArrayList<Double> weights) {

        for (int i = 0; i < weights.size() - 1; i++) {
            weights.set(i, (weights.get(i + 1) - weights.get(i)));
        }

        return weights;
    }

}

我在上面尝试遍历数组列表的所有元素并打印出它们各自的连续差异(取数组列表的索引之一并减去索引零)但是,我的for循环似乎遍历了所有元素打印它们各自的差异,然后将我的初始数组的最后一个数字添加到我的新数组列表的末尾,其中包含所有差异。我该如何解决这个问题?

公共 class A 部分 {

public static void main(String args[]) {


    ArrayList<Double> weights = new ArrayList<Double>();


    weights.add(145.0);
    weights.add(146.5);
    weights.add(146.5);
    weights.add(147.0);
    weights.add(146.0);
    weights.add(148.0);
    weights.add(148.5);


    ArrayList<Double> printWeightChanges = getWeightChanges(weights);

新尝试:

}

/**
 * Part a
 */

public static ArrayList<Double> getWeightChanges(ArrayList<Double> weights) {

    ArrayList<Double> weightDifferences = new ArrayList <Double>();

    for (int i = 0; i < weights.size() - 1; i++) {
        weightDifferences.add(i, weights.get(i + 1) - weights.get(i));

    }

    System.out.println(weightDifferences);
    return weightDifferences;


    }

}

这会产生各种错误:

线程中出现异常 "main" java.lang.IndexOutOfBoundsException:索引 145 超出长度 6 的范围 在 java.base/jdk.internal.util.Preconditions.outOfBounds(Preconditions.java:64) 在 java.base/jdk.internal.util.Preconditions.outOfBoundsCheckIndex(Preconditions.java:70) 在 java.base/jdk.internal.util.Preconditions.checkIndex(Preconditions.java:248) 在 java.base/java.util.Objects.checkIndex(Objects.java:372) 在 java.base/java.util.ArrayList.get(ArrayList.java:458) 在 PartB.getWeights(PartB.java:37) 在 PartB.main(PartB.java:25)

My attempt Code output from my attempt

这是因为您定义循环限制的方式:

for (int i = 0; i < weights.size() - 1; i++)

与数组 (i < weights.size() - 1) 相比,循环更改的元素少了一个。

我建议创建另一个差异列表,如下所示:

public static List<Double> getWeightChanges(ArrayList<Double> weights) {

    List<Double> diffs = new ArrayList<>();
    for (int i = 0; i < weights.size() - 1; i++) {
        diffs.add(weights.get(i + 1) - weights.get(i));
    }

    return diffs;
}

您尝试输出的内容与原始列表的长度不同(具体来说,少一个数据点)。您需要 remove() 列表的最后一个元素,或者创建一个新列表以不同大小输出。

由于您的原始列表包含 7 个双精度数,而您更改了前 6 个,因此列表的最后一个元素保持不变。