Многомерные массивы разных размеров

У меня просто была идея проверить что-то, и это сработало:

    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) Его можно расширять и сокращать длины примитивных массивов, потому что за кулисами вы просто выделяете и освобождаете куски памяти.