Копирование столбцов из 2D массива в массив object 1D

Я пытался скопировать столбцы 2D массива в массив 1D. Созданный мною класс запасов имеет двойной массив [] с именем data. Последний цикл пытается напечатать некоторые значения, которые должны быть в первом стоковом объекте, но на самом деле печатает значения из последнего объекта.

Stock arr[] = new Stock[numcols];   // creates array with the same n of slots as columns
        double[] temp = new double[numrows-1];

        for(int i=1; i<numcols; i++){
            for(int j=1; j<numrows; j++){
                temp[j-1] = fluct[j][i];
            }
            arr[i-1] = new Stock(temp, compName[i-1], price[i-1]);
        }
        for(int i=0; i<numrows/20; i++)
            System.out.println(arr[0].data[i] + arr[0].name);

На самом деле, если я циклически печатаю arr[j].data[i] будет выводить одинаковые значения для всех j. Похоже, что цикл создает все объекты с одинаковыми значениями для каждого запаса, но я не вижу причин, почему он это делает.

Я проверил флукт 2D массива и все значения там в порядке. Я начинаю циклы в позиции 1, так как значения в позиции 0 не представляют интереса. Также пробовал печатать отдельно значения temp[] и они были правильными, но все равно данные в объектах были неправильными.

Вот стоковый объект (опущены методы getMean/getDev для краткости):

public class Stock{
    public static double[] data;
    public static String name;
    public static double stDev;
    public static double price;
    public static double mean;

    public Stock(double[] newData, String newName, double newPrice){
        this.data = newData;
        this.name = newName;
        this.price = newPrice;
        this.mean = getMean();
        this.stDev = getDev();
    }
}

2 ответа

  1. Проблема в том, что вы определяете свой временный массив. Вы должны сделать это внутри первого forцикла:

    Stock arr[] = new Stock[numcols];   // creates array with the same n of slots as columns
    
    for(int i=1; i<numcols; i++){
        double[] temp = new double[numrows-1];
        for(int j=1; j<numrows; j++){
            temp[j-1] = fluct[j][i];
        }
        arr[i-1] = new Stock(temp, compName[i-1], price[i-1]);
    }
    for(int i=0; i<numrows-1; i++)
        System.out.println(arr[0].data[i] + arr[0].name);
    

    Таким образом, для каждого элемента arr будет использоваться новый temp. В настоящее время вы используете один и тот же временный объект, и его значения обновляются, а также значения для элементов arr.
    Также я изменил условие для последнего цикла for на i<numrows-i. Не знаю, зачем вам нужно i<numrows/20=)

    Удачи в изучении Java!

  2. Ну, это неловко, но я, наконец, понял, что было не так. В моем классе объектов у меня были статические переменные! Удаление это решило его.