Как ссылаться на многомерные массивы?

Я пытаюсь понять многомерные массивы в Java, но я думаю, что это применимо к любому языку. Пожалуйста, обратите внимание на этот фрагмент, который я нашел в Интернете:

          //************************************
            //     static array initialization
            //************************************
    byte[][] smallArray = { { 10, 11, 12, 13 },
    { 20, 21, 22, 23 },
    { 30, 31, 32, 33 },
    { 40, 41, 42, 43 }, };

    // Display the array element at row 2, column 3
    System.out.println(smallArray[1][2]); 
// Value is 21

Почему 21? Я думал будет 22.

Я посмотрел это, потому что пытаюсь понять, что означает длина в этом контексте:

public class Pieces {
    int thePieces[][][];
    public Pieces(){

    }
    public int[][][] createPieces(){

        /* pieces in order below
                **** [0]

                **
                **

                *
                ****

                   *
                ****

                ***
                 *

                **
                 **

                 **
                ** [6]
         *
         *
         *
         */
       int myPieces [][][] =
       {
           {  //square
               {0,0},
               {1,0},
               {1,1},
               {0,1}

           },
           { //T
               {-1,0},
               {0,0},
               {0,1},
               {1,0}
           }

       };

       thePieces = myPieces;

    return thePieces;
    }

    public void printPieces(){

        System.out.println(thePieces[0][0].length);
    }

}

Я пытаюсь изучить Java, создав клон тетриса. Чего я не понимаю, так это того, почему для использования [][] требуется длина. Это был единственный способ добраться до работы. Я попробовал thePieces[0][0][0].length, но получил ошибку, которую не понял?

Почему мне не нужно ставить [][][], чтобы получить ссылку? Я видел в Интернете, где на первый «уровень» массива ссылались myArray.length вместо myArray[].length. Что же тогда я говорю с myArray[][].length (кажется, 2-й, 3-й уровни, но я не получаю того, что ожидаю)?

Я запустил свой кусок кода и получил 2. Я понятия не имею, почему это два. Это потому что у меня два набора на третьем уровне? Я ожидал получить четыре из-за четырех наборов очков.

Спасибо, что помогли мне понять.

РЕДАКТИРОВАТЬ: я понял, почему это два. Это дает мне две мои точки в самом внутреннем наборе. Если бы я хотел четыре, я бы использовал thePieces[0].length. Но как насчет первого примера? Это опечатка?


person johnny    schedule 21.01.2010    source источник


Ответы (3)


Почему 21? Я думал будет 22.

22 правильно - я запустил код, чтобы проверить это.

Индексы относятся к элементам массива, от внешних к внутренним. Так,

myPieces[0] — это { {0,0}, {1,0}, {1,1}, {0,1} } (массив, содержащий массивы), myPieces[0][0] — это {0,0} (массив, содержащий целые числа), а myPieces[0][0][0] — это 0 (целое число).

person Kaleb Brasee    schedule 21.01.2010
comment
Думаю, это просто опечатка. Спасибо. - person johnny; 21.01.2010

Почему 21? Я думал будет 22.

Пример неправильный. Будет 22.

Я попробовал thePieces[0][0][0].length, но получил ошибку, которую не понял?

Это требует небольшого пояснения. Когда ты сказал:

int[][][] thePieces = { ... }

Вы объявляете переменную с именем thePieces как массив массивов массивов целых чисел. Звучит смешно. В любом случае, thePieces.length действителен, потому что thePieces — это своего рода массив. Когда вы разыменовываете массив, например:

thePieces[index]

Вы получаете массив массивов целых чисел, для которого вы можете вызвать длину, потому что это массив чего-то. ТАК:

thePieces[index0][index1]

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

thePieces[index0][index1][index2]

Дает вам старый добрый int, у которого нет свойства length.

Я запустил свой кусок кода и получил 2. Я понятия не имею, почему это два. Это потому что у меня два набора на третьем уровне? Я ожидал получить четыре из-за четырех наборов очков.

Ты звонишь:

System.out.println(thePieces[0][0].length);

Что печатает 2, потому что thePieces[0] указывает на этот массив:

{  //square
    {0,0},
    {1,0},
    {1,1},
    {0,1}
}

который вернет 4 (если вы вызвали thePieces[0].length). Однако thePieces[0][0] указывает на:

{0, 0}

который имеет длину 2.

person Travis Gockel    schedule 21.01.2010
comment
теперь понял думаю. Если бы я использовал [][][] у меня не было бы длины, кроме значения, потому что это ссылка на конкретный элемент в массиве массивов массивов. Я мог бы использовать (я предполагаю) int myInt = thePieces[0][1][0], но не .length по указанным вами причинам. На самом деле, это единственный способ получить значение, а все остальные способы, кроме [][][], должны использовать длину (или, может быть, что-то еще значимое для массивов), потому что они указывают только на массив на каком-то уровне (массив массива массива, массива массива, массива). - person johnny; 21.01.2010

Как отметили другие плакаты, вы правы, думая, что должно быть выведено «22».

В качестве примечания, если у вас нет конкретная причина, по которой вам следует рассмотреть возможность использования одной из коллекций Java, а не массива. Возможно Вектор Векторов (то есть: Vector<Vector<Integer>>). Не то, чтобы неправильно использовать массив, однако лично мне гораздо проще работать с коллекциями, чем с массивами.

person Tom Neyland    schedule 21.01.2010
comment
Я надеюсь попробовать это после того, как пойму, как использовать массивы. Спасибо. - person johnny; 21.01.2010