Многомерные массивы разных размеров
У меня просто была идея проверить что-то, и это сработало:
String[][] arr = new String[4][4];
arr[2] = new String[5];
for(int i = 0; i < arr.length; i++)
{
System.out.println(arr[i].length);
}
Вывод, очевидно, равен:
4
4
5
4
Итак, мои вопросы:
- Это хороший или плохой стиль кодирования?
- Что это может быть полезно?
- И самое главное, есть ли способ создать такую конструкцию в самой декларации?
- Также... почему это возможно?
Ответы
Ответ 1
- Это хороший или плохой стиль кодирования?
Как и все, это зависит от ситуации. Бывают ситуации, когда зубчатые массивы (как их называют) действительно подходят.
- Что это может быть полезно?
Ну, для хранения наборов данных с разной длиной в одном массиве. Например, если бы у нас были строки "hello"
и "goodbye"
, мы могли бы захотеть сохранить их массивы символов в одной структуре. Эти массивы char имеют разную длину, поэтому мы будем использовать неровный массив.
- И самое главное, есть ли способ создать такую конструкцию в самой декларации?
Да:
char[][] x = {{'h','e','l','l','o'},
{'g','o','o','d','b','y','e'}};
- Также... почему это возможно?
Потому что это разрешено спецификацией языка Java, §10.6.
Ответ 2
-
Это прекрасный стиль кодирования, в этом нет ничего плохого. Я сам создал зубчатые массивы для различных проблем в прошлом.
-
Это хорошо, потому что вам может потребоваться хранить данные таким образом. Данные, сохраненные таким образом, позволят вам сохранить память. Было бы естественным способом более эффективно отображать элементы в определенных сценариях.
-
В одной строке без явного заполнения массива? Нет. Это самое близкое, о чем я могу думать.
int[][] test = new int[10][];
test[0] = new int[100];
test[1] = new int[500];
Это позволит вам заполнить строки массивами разной длины. Я предпочитаю этот подход для заполнения такими значениями:
int[][] test = new int[][]{{1,2,3},{4},{5,6,7}};
Потому что это более читаемо и практично печатать при работе с большими оборванными массивами.
- Его можно сделать по причинам, указанным в 2. У людей есть веские причины для использования оборванных массивов, поэтому создатели языка дали нам способ сделать это.
Ответ 3
(1) Хотя ничто не является технически/функционально/синтаксически неправильным с этим, я бы сказал, что это плохой стиль кодирования, поскольку он нарушает предположение, обеспечиваемое инициализацией объекта (String [4] [4]). Это, в конечном счете, зависит от предпочтений пользователей; если вы только читаете это, и вы точно знаете, что делаете, все будет хорошо. Если другие люди используют/используют ваш код, это добавляет путаницу.
(2) Единственная концепция, о которой я мог подумать, - это иметь несколько массивов, которые нужно прочитать, но заранее не знали их размер. Тем не менее, было бы разумнее использовать ArrayList<String>
в этом случае, если только дополнительные накладные расходы не были серьезными.
(3) Я не уверен, о чем вы спрашиваете. Вы имеете в виду, можете ли вы как-то указать отдельные длины массивов в этом первоначальном объявлении? Ответ на этот вопрос - нет.
(4) Его можно расширять и сокращать длины примитивных массивов, потому что за кулисами вы просто выделяете и освобождаете куски памяти.