Как мне успешно пройти предварительно заполненный ArrayList, чтобы найти различие каждого последовательного элемента и распечатать его? - PullRequest
0 голосов
/ 09 марта 2019
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;
    }

}

Я попытался описать выше все элементы списка массивов и распечатать их соответствующие последовательные различия (принимая первый индекс списка массивов и вычесть нулевой индекс), однако цикл my for, кажется, проходит все элементы, печатающие их соответствующие различия но затем добавляет последний номер моего исходного массива в конец моего нового списка массивов со всеми отличиями. Как мне это исправить?

Убличный класс PartA {

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)

Моя попытка Вывод кода из моей попытки

Ответы [ 2 ]

0 голосов
/ 09 марта 2019

То, что вы пытаетесь вывести, будет иметь другую длину (в частности, на одну точку данных меньше), чем ваш исходный список. Вам нужно либо remove() последний элемент вашего списка, либо создать новый список для вывода с другим размером.

Поскольку ваш первоначальный список содержит 7 двойных, а вы изменили первые 6, последний элемент списка остается прежним.

0 голосов
/ 09 марта 2019

Это из-за того, как вы определили пределы цикла:

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;
}
...