Я знаю, что я могу добавить измерение в массив, добавив еще [] рядом с ним. Но могу ли я иметь более одного измерения в java.util.ArrayList? Как я могу это сделать?
Два размерных массива
Ответ 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>>();