Два размерных массива - программирование
Подтвердить что ты не робот

Два размерных массива

Я знаю, что я могу добавить измерение в массив, добавив еще [] рядом с ним. Но могу ли я иметь более одного измерения в java.util.ArrayList? Как я могу это сделать?

4b9b3361

Ответ 1

Да, это возможно. Просто у элементов ArrayList также есть ArrayLists.

ArrayList<ArrayList<Integer>> twoDArrayList = new ArrayList<ArrayList<Integer>>();

Это будет работать не только с ArrayLists, но и с другими типами коллекций.

Ответ 2

List<ArrayList<Integer>> twoDArrayList = new ArrayList<ArrayList<Integer>>();
Ответ

@rgettman выполняет задание, однако есть несколько предостережений, чтобы принять к сведению:

Предостережение 1: размеры

В наиболее распространенном случае размеры массива предварительно определены, например:

int[][] array = new int[5][6];

В этом случае массив будет иметь "прямоугольную" форму определенных размеров:

  0 1 2 3 4 5
0 [][][][][][]
1 [][][][][][]
2 [][][][][][]
3 [][][][][][]
4 [][][][][][]  

Как было предложено другим участником в комментариях ниже, там больше. "Двумерный массив" представляет собой всего лишь массив других массивов, а строка кода выше - короткая для:

int[][] array = new int[5][];
array[0] = new int[6];
array[1] = new int[6];
array[2] = new int[6];
array[3] = new int[6];
array[4] = new int[6];

Альтернативно, дочерние массивы могут быть созданы с различными размерами, и в этом случае "форма данных" больше не будет прямоугольной:

int[][] array = new int[5][];
array[0] = new int[2];
array[1] = new int[4];
array[2] = new int[1];
array[3] = new int[6];
array[4] = new int[3];

  0 1 2 3 4 5
0 [][]        
1 [][][][]    
2 []          
3 [][][][][][]
4 [][][]

Использование подхода ArrayList<ArrayList<Integer>> приведет к "списку списков", где длина всех задействованных списков будет расти в результате выполненных операций.

Нет никаких сокращений, чтобы предварительно определить размеры. Списки дочерних элементов должны быть вставлены в главный список, а элементы данных должны быть вставлены в дочерние списки. Таким образом, форма данных будет похожа на второй пример:

0 [][]        <- list with 2 elements
1 [][][][]    <- list with 4 elements
2 []          ...and so on
3 [][][][][][]
4 [][][]

Caveat 2: значения по умолчанию для данных

Массивы позволяют использовать примитивные типы данных (например, "int" ), а также их бокс-аналоги (такие как "Целое число" ). Они ведут себя по-разному, когда речь идет о значениях по умолчанию для элементов.

int[][] array1 = new int[5][6];         // all elements will default to 0
Integer[][] array2 = new Integer[5][6]; // all elements will default to null

Списки (как и все другие коллекции) позволяют использовать только типы в штучной упаковке. И поэтому, хотя возможно предварительно определить длину списка, значение по умолчанию для его элементов всегда будет равно нулю.

List<Integer> = new ArrayList<Integer>(10); // all elements will default to null

Ответ 3

Да, вы можете! В регулярном массиве, когда вы добавляете вторую пару фигурных скобок, вы создаете обычный массив, в котором хранятся объекты типа array. Вы можете просто сделать то же самое здесь, заставив ArrayList держать вещи типа ArrayList: ArrayList<ArrayList<Object>> list = new ArrayList<ArrayList<Object>>();