首页 > 解决方案 > 二维数组的 ArrayList

问题描述

我创建了一个非常简单的程序来创建一个二维浮点数组的 ArrayList。但是在列表中添加新元素似乎会覆盖或破坏以前的元素。

我做错了什么,应该如何实现这个功能?

import java.util.ArrayList;

public class multiDArrayTest {
    
    public static void main(String[] args) {
        float[][] coeff = new float[3][6];
        ArrayList<float[][]> basisCoeffs;
        basisCoeffs = new ArrayList<float [][]>(2);
        
        coeff[0][0] = 0;
        coeff[0][1] = 100;
        coeff[0][2] = -50;
        basisCoeffs.add(coeff);
        
        
        coeff[0][0] = 50;
        coeff[0][1] = 200;
        coeff[0][2] = -400;
        
        basisCoeffs.add(coeff);
        
        System.out.println(basisCoeffs.get(0)[0][0]);
        System.out.println(basisCoeffs.get(0)[0][1]);
        System.out.println(basisCoeffs.get(0)[0][2]);
        
        //I should get 0 100 -50 50, but i don't? Where does it go ??
        
        System.out.println(basisCoeffs.get(1)[0][0]);
        System.out.println(basisCoeffs.get(1)[0][1]);
        System.out.println(basisCoeffs.get(1)[0][2]);
        
    }

}

标签: javaarraylist

解决方案


发生的情况是您拥有coeff具有第一个值的数组,将其添加到列表中,一切都很好,但是当您coeff在将其添加到列表之前再次编辑时,您还编辑了位于列表位置 0 的那个,因为两者都coeff作为列表位置 0 的元素,它们在 Java 中引用同一个对象。一种选择是创建一个副本,另一种是分别拥有两个数组。另外,由于我观察到您的尺寸是静态的,您可以直接将值添加到指定位置,例如:

import java.util.ArrayList;

public class multiDArrayTest {
   public static void main(String[] args) {
       ArrayList<float[][]> basisCoeffs = new ArrayList<float [][]>(2);

       basisCoeffs.add(new float[3][6]);
       basisCoeffs.add(new float[3][6]);
    
       // First values of coeffs
       basisCoeffs.get(0)[0][0] = 0;
       basisCoeffs.get(0)[0][1] = 100;
       basisCoeffs.get(0)[0][2] = -50;
       
       // Second values of coeffs
       basisCoeffs.get(1)[0][0] = 50;
       basisCoeffs.get(1)[0][1] = 200;
       basisCoeffs.get(1)[0][2] = -400;
        
       System.out.println(basisCoeffs.get(0)[0][0]);
       System.out.println(basisCoeffs.get(0)[0][1]);
       System.out.println(basisCoeffs.get(0)[0][2]);
        
       System.out.println(basisCoeffs.get(1)[0][0]);
       System.out.println(basisCoeffs.get(1)[0][1]);
       System.out.println(basisCoeffs.get(1)[0][2]);
    }
}

推荐阅读