динамический 2d массив в Java с использованием Arraylist - PullRequest
1 голос
/ 22 августа 2010

Я обнаружил некоторую проблему при создании динамического 2d-массива с помощью 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();
 }   

   }
}

Выход:

 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

Ожидаемый результат -

 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

Я не понимаю, почему последний элемент перезаписывает все остальные элементы.

Ответы [ 2 ]

9 голосов
/ 22 августа 2010

Инициализируйте новый Integer[] каждый раз, когда добавляете новую строку.

То есть сделайте это так:

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);

Или еще лучше, сделайте это так:

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});
1 голос
/ 22 августа 2010

Массивы - это объекты. ArrayList.add(E) добавляет ссылку на данный объект E в список; он не копирует сам объект.

Итак, вы должны сделать:

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

Создает новый массив объектов, поэтому вторая строка данных записывается в отдельный массив.

...