Как я могу ссылаться на многомерные массивы? - PullRequest
5 голосов
/ 21 января 2010

Я пытаюсь понять многомерные массивы в 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. Но как насчет первого примера? Это опечатка?

Ответы [ 3 ]

5 голосов
/ 21 января 2010

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

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

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

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

2 голосов
/ 21 января 2010

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

Пример неверный.Это будет 22.

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

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

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

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

thePieces[index]

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

thePieces[index0][index1]

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

thePieces[index0][index1][index2]

Дает вам простой старый int, который не имеет свойства длины.

Я запустил свой кусок кода и получил 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.

0 голосов
/ 21 января 2010

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...