Инициализация трехмерного массива массивов в Java - PullRequest
0 голосов
/ 28 ноября 2011

У меня есть многомерный массив, как:

private static ArrayList [] [] pVTable = new ArrayList [35] [12];

Моя первая попытка инициализировать его была:

for (ArrayList[] x : pVTable) {
    for (ArrayList y : x) {
        y = new ArrayList<TableValue>();
    }
}

, которая не работала.

Iв итоге мы сделали это более вручную, как в:

for ( int i = 0; i < pVTable.length; i++) {
    for ( int j = 0; j < pVTable[0].length; j++) {
        pVTable [i] [j] =  new ArrayList<TableValue>();
    }
}

, который отлично работает.

Хотя у меня есть решение, мне было интересно, почему первый (более элегантный) фрагмент кода не 'делать ту же работу?

Ответы [ 4 ]

1 голос
/ 28 ноября 2011

В первом фрагменте, если мы уберем синтаксический сахар оператора foreach (:), код преобразуется в:

for (int xIndex = 0; xIndex < pVTable.length; xIndex++) {
    ArrayList[] x = pVTable[xIndex];
    for (int yIndex = 0; yIndex < x.length; yIndex++) {
        ArrayList y = x[yIndex];
        y = new ArrayList<TableValue>();
    }
}

Как видите, ничего не назначаетсяк фактическому массиву - только к временной переменной y.

1 голос
/ 28 ноября 2011

Вы смешиваете ArrayList (часть api collection) с Arrays, что довольно смущает (во всяком случае, для меня)

Я бы предложил что-то вроде этого:

List<Point> myShape =  new ArrayList<Point>;

Где точка содержит два целых числа, представляющих X и Y.

1 голос
/ 28 ноября 2011

В первом примере ваш код, хотя и изменяет y , делает не , изменяет x .

0 голосов
/ 28 ноября 2011

Область действия первого неверна. y это просто переменная-заполнитель. Изменение, которое не меняет базовый объект, только объект, на который ссылается y. Вы можете увидеть ту же проблему в следующем фрагменте кода:

public static  int x = 2;

public static void foo(int y) {
    y = 3;//does nothing outside of foo
}

public static void main(String[] args) {
    System.out.println(x);//prints 2
    foo(x);
    System.out.println(x);//prints 2, x hasn't changed.
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...