java java中使用Arraylist的动态二维数组

声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow 原文地址: http://stackoverflow.com/questions/3540713/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me): StackOverFlow

提示:将鼠标放在中文语句上可以显示对应的英文。显示中英文
时间:2020-10-30 02:18:46  来源:igfitidea点击:

dynamic 2d array in java using Arraylist

javaarraysdynamicarraylist2d

提问by user427504

I found some problem in creating dynamic 2d array with arraylist,The original code is tediously long to read so i am giving a simple code here,the problem is same in both the cases:

我在用arraylist创建动态二维数组时发现了一些问题,原始代码读起来很乏味,所以我在这里给出一个简单的代码,这两种情况下的问题都是一样的:

import java.util.*;

class test{
 public static void main(String args[]){
    Integer test[]=new Integer[3];

    ArrayList<Integer[]> al=new ArrayList<Integer[]>();

    int i,t;

     test[0]=1;
     test[1]=2;
     test[2]=3;


     al.add(test);
     test[0]=4;
     test[1]=5;
     test[2]=6;

  al.add(test);

     test[0]=7;
     test[1]=8;
     test[2]=9;

  al.add(test);



     test[0]=10;
     test[1]=11;
     test[2]=12;
  al.add(test);



     Integer table[][]=new Integer[al.size()][];
     table=al.toArray(table);

     for(i=0;i<=al.size()-1;i++){

     for(t=0;t<3;t++){
       System.out.print(" "+i+" "+t+" ");
       System.out.print(" "+table[i][t]+" ");}
     System.out.println();
 }   

   }
}

Output:

输出:

 0 0  10  0 1  11  0 2  12
  1 0  10  1 1  11  1 2  12
 2 0  10  2 1  11  2 2  12
 3 0  10  3 1  11  3 2  12

Output expected is

预期输出为

 0 0   1  0 1  2  0 2  3
 1 0   4  1 1  5  1 2  6
 2 0   7  2 1  8  2 2  9
 3 0  10  3 1  11  3 2  12

I don't under stand why the last element is over writting all other elements.

我不明白为什么最后一个元素会覆盖所有其他元素。

回答by missingfaktor

Initialize a new Integer[]every time you add a new row.

Integer[]每次添加新行时初始化一个新的。

That is, do it like this:

也就是说,这样做:

Integer[] test = new Integer[3];
List<Integer[]> al = new ArrayList<Integer[]>();
int i,t;
test[0]=1;
test[1]=2;
test[2]=3;
al.add(test);
test = new Integer[3]; // Note this line
test[0]=4;
test[1]=5;
test[2]=6;
al.add(test);
test = new Integer[3]; // Note this line
test[0]=7;
test[1]=8;
test[2]=9;
al.add(test);
test = new Integer[3]; // Note this line
test[0]=10;
test[1]=11;
test[2]=12;
al.add(test);


Or better yet, do it this way:

或者更好的是,这样做:

List<Integer[]> al = new ArrayList<Integer[]>();
al.add(new Integer[]{1, 2, 3});
al.add(new Integer[]{4, 5, 6});
al.add(new Integer[]{7, 8, 9});
al.add(new Integer[]{10, 11, 12});

回答by meriton

Arrays are objects. ArrayList.add(E)adds a reference to the given Eobject to the list; it doesn't copy the object itself.

数组是对象。ArrayList.add(E)将给定E对象的引用添加到列表中;它不会复制对象本身。

So you should do:

所以你应该这样做:

al.add(test);
test = new int[3];

Which creates a new array object, so the second row of data is written into a separate array.

它创建了一个新的数组对象,因此第二行数据被写入一个单独的数组。