如何引用多维数组?

5

我正在尝试理解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。我不明白为什么需要长度才能使用[][]. 这是我唯一能让它工作的方式。我尝试了Pieces[0][0][0].length但收到了一个我不理解的错误信息?
为什么我不必加[] [] []就可以引用?我在网上看到第一个数组“级别”被引用为myArray.length而不是myArray[].length.那么,myArray[][].length表示什么意思(似乎是第2、3个级别,但我得到的结果与我的期望不同)?
我运行了我的代码并得到了2。我不知道为什么是2。这是因为我在第三层有两个集合吗?我期望得到四个点,所以我预计会得到四个。
谢谢你帮我理解。
编辑:我弄清楚为什么是2了。它给了我内部集合中的两个点。如果我想得到四个,我会使用Pieces[0].length。但第一个例子呢?这是一个打字错误吗?
3个回答

5
为什么是21?我以为应该是22。
22才是正确的——我已经运行了代码进行验证。
索引指的是数组元素,从外部到内部。所以,
myPieces [0] 是 { {0,0}, {1,0}, {1,1}, {0,1} }(包含数组的数组), myPieces [0] [0] 是 {0,0}(包含整数的数组),而 myPieces [0] [0] [0] 是 0(一个整数)。

我猜这只是一个打字错误。谢谢。 - johnny

2

为什么是21?我以为它应该是22。

这个例子是错误的。正确的应该是22。

我尝试使用Pieces[0][0][0].length,但出现了一个我不理解的错误?

这需要一点解释。当你说:

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

你正在声明一个名为thePieces的变量,它是一个由整数数组组成的数组的数组。听起来有点滑稽。无论如何,thePieces.length是有效的,因为thePieces是某种类型的数组。当你像这样解除引用数组时:

thePieces[index]

您会得到一个整数数组的数组,您可以调用其length属性,因为它是包含其他数组的数组。所以:
thePieces[index0][index1]

这是一个int类型的数组,你可以调用length方法获取它的长度(我希望你现在能看出一个模式)。

thePieces[index0][index1][index2]

提供的是一个普通的整数,没有长度属性。

我运行了我的代码片段,得到了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。


我现在明白了。如果我使用[][][],我没有长度,但有一个值,因为那是数组中特定项的引用。我可以使用(我猜)int myInt = thePieces [0] [1] [0],但不能使用.length,因为你所说的原因。实际上,这是获取值的唯一方法,除了[][][]之外的所有其他方法都必须使用length(或者对于数组有意义的其他内容),因为它们只指向某个级别的数组(数组的数组,数组)。 - johnny

0

正如其他发帖者所指出的,你想要输出'22'是正确的。

顺便说一下,除非你有特定原因不使用,否则应该考虑使用Java集合之一而不是数组。也许是一个向量的向量(即:Vector<Vector<Integer>>)。并不是说使用数组是错误的,但我个人发现使用集合比使用数组更容易。


我希望在了解如何使用数组之后再尝试。谢谢。 - johnny

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接