2010-01-21 34 views
5

Tôi đang cố gắng hiểu mảng đa chiều trong Java, nhưng tôi nghĩ nó áp dụng cho bất kỳ ngôn ngữ nào. Vui lòng xem xét đoạn mã này tôi tìm thấy trên web:Tôi làm cách nào để tham chiếu các mảng đa chiều?

  //************************************ 
      //  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 

Tại sao lại là 21? Tôi nghĩ rằng nó sẽ là 22.

Tôi nhìn này lên vì tôi đang cố gắng để tìm ra những gì chiều dài có nghĩa là trong bối cảnh này:

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); 
    } 

} 

Tôi đang cố gắng tìm hiểu java bằng cách tạo ra một bản sao Tetris. Những gì tôi không hiểu là lý do tại sao độ dài là cần thiết để sử dụng [] []. Đó là cách duy nhất tôi có thể làm việc. Tôi đã thử ThePieces [0] [0] [0] .length nhưng có lỗi mà tôi không hiểu?

Tại sao tôi không phải đặt [] [] [] để nhận tham chiếu? Tôi thấy trực tuyến, nơi "cấp độ" đầu tiên của mảng được tham chiếu myArray.length thay vì myArray []. Những gì sau đó tôi nói với myArray [] [] chiều dài (có vẻ như 2, 3 cấp độ nhưng tôi không nhận được những gì tôi mong đợi)?

Tôi chạy mã mảnh của mình và nhận được 2. Tôi không biết tại sao lại là hai. Có phải vì tôi có hai bộ ở cấp độ thứ ba không? Tôi dự kiến ​​sẽ nhận được bốn vì bốn bộ điểm.

Cảm ơn bạn đã giúp tôi hiểu.

EDIT: Tôi đã tìm ra lý do tại sao đó là hai. Nó cho tôi hai điểm trong bộ trong cùng. Nếu tôi muốn bốn tôi sẽ sử dụng các [.] Độ dài. Nhưng còn ví dụ đầu tiên thì sao? Nó là một lỗi đánh máy?

Trả lời

5

Tại sao lại là 21? Tôi nghĩ rằng nó sẽ là 22.

22 là chính xác - Tôi đã chạy mã để xác minh.

Các chỉ mục tham chiếu đến các phần tử mảng, từ các chỉ mục bên ngoài đến phần tử bên trong. Vì vậy,

myPieces[0]{ {0,0}, {1,0}, {1,1}, {0,1} } (một mảng chứa mảng), myPieces[0][0]{0,0} (một mảng chứa ints), và myPieces[0][0][0]0 (một int).

+0

Tôi đoán nó chỉ là một lỗi đánh máy. Cảm ơn bạn. – johnny

2

Tại sao lại là 21? Tôi nghĩ rằng nó sẽ là 22.

Ví dụ này là sai. Nó sẽ là 22.

Tôi đã thử các [0] [0] [0]. Độ dài nhưng có lỗi mà tôi không hiểu?

Điều này đòi hỏi một chút giải thích. Khi bạn nói:

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

Bạn đang khai báo biến được gọi làPieces là mảng mảng của mảng int. Nghe có vẻ buồn cười. Dù sao, cácPieces.length là hợp lệ, bởi vì cácPieces là một mảng của một số loại.Khi bạn dereference mảng, như vậy:

thePieces[index] 

Bạn nhận được một mảng các mảng ints, mà bạn có thể gọi chiều dài, bởi vì nó là một mảng của một cái gì đó. SO:

thePieces[index0][index1] 

là một mảng ints, bạn có thể gọi chiều dài (Tôi hy vọng bạn sẽ thấy mẫu bây giờ).

thePieces[index0][index1][index2] 

Cung cấp cho bạn một int cũ, không có thuộc tính độ dài.

Tôi chạy mã mẫu và nhận 2. Tôi có không biết tại sao lại là hai. Có phải vì tôi có hai bộ ở cấp độ thứ ba không? Tôi dự kiến ​​sẽ nhận được bốn vì bốn bộ điểm.

Bạn gọi:

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

nào in 2 vì thePieces [0] trỏ tới mảng này:

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

mà sẽ trả lại 4 (nếu bạn gọi thePieces [0] .length). Tuy nhiên, thePieces [0] [0] trỏ tới:

{0, 0} 

trong đó có chiều dài 2.

+0

Tôi hiểu bây giờ tôi nghĩ. Nếu tôi sử dụng [] [] [] Tôi không có độ dài mà là một giá trị vì đó là tham chiếu đến một mục cụ thể trong mảng mảng. Tôi có thể sử dụng (tôi đoán) int myInt = thePieces [0] [1] [0] nhưng không phải là .length vì những lý do bạn đã nói. Trong thực tế, đó là cách duy nhất để có được một giá trị và tất cả các cách khác ngoài [] [] [] phải sử dụng chiều dài (hoặc có thể có ý nghĩa khác cho mảng) vì chúng chỉ trỏ đến một mảng ở một mức nào đó (mảng mảng) mảng, mảng mảng, mảng). – johnny

0

Khi áp phích khác đã lưu ý, bạn là chính xác trong suy nghĩ rằng nó cần được đầu ra '22'.

Lưu ý phụ, trừ khi bạn có specific reason not to, bạn nên xem xét sử dụng một trong các Bộ sưu tập Java thay vì một mảng. Có lẽ một Vector Vectơ (ví dụ: Vector<Vector<Integer>>). Không phải là không chính xác để sử dụng một mảng, tuy nhiên cá nhân tôi tìm thấy nó dễ dàng hơn nhiều để làm việc với Bộ sưu tập hơn mảng.

+0

Tôi hy vọng sẽ thử điều đó sau khi tôi hiểu cách sử dụng các mảng. Cảm ơn bạn. – johnny

Các vấn đề liên quan