2010-01-21 21 views
5

Estoy tratando de comprender matrices multidimensionales en Java, pero creo que se aplica a cualquier idioma. Considere este fragmento que encontré en la web:¿Cómo hago referencia a las matrices multidimensionales?

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

¿Por qué es 21? Pensé que sería 22.

Miré esto porque estoy tratando de averiguar qué longitud significa en este contexto:

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

} 

Estoy tratando de aprender Java mediante la creación de un clon de Tetris. Lo que no entiendo es por qué se requiere longitud para usar [] []. Era la única forma en que podía llegar al trabajo. Probé los Pieces [0] [0] [0] .length pero obtuve un error que no entendí?

¿Por qué no tengo que poner [] [] [] para obtener la referencia? Vi en línea donde se hizo referencia al primer "nivel" de la matriz myArray.length en lugar de myArray []. Length. ¿Qué estoy diciendo con myArray [] []. Length (parece segundo, tercer nivel pero no obtengo lo que esperaba)?

Corrí mi código de pieza y obtuve 2. No tengo idea de por qué son dos. ¿Es porque tengo dos juegos en el tercer nivel? Esperaba obtener cuatro debido a los cuatro conjuntos de puntos.

Gracias por ayudarme a entender.

EDIT: Descubrí por qué son dos. Me está dando mis dos puntos en el conjunto más interno. Si quisiera cuatro, usaría ThePieces [0] .length. Pero, ¿qué pasa con el primer ejemplo? ¿Es un error tipográfico?

Respuesta

5

¿Por qué es 21? Pensé que sería 22.

22 es correcto - Ejecuté el código para verificarlo.

Los índices se refieren a los elementos de la matriz, desde los exteriores a los internos. Por lo tanto,

myPieces[0] es { {0,0}, {1,0}, {1,1}, {0,1} } (una matriz que contiene arrays), myPieces[0][0] es {0,0} (una matriz que contiene ints), y myPieces[0][0][0] es 0 (un int).

+0

Supongo que es solo un error tipográfico. Gracias. – johnny

2

¿Por qué es 21? Pensé que sería 22.

El ejemplo es incorrecto. Será 22.

Probé thePieces [0] [0] [0] .length pero recibí un error que no entendí?

Esto requiere una pequeña explicación. Cuando uno dice:

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

está declarando una variable llamada thePieces ser una matriz de matrices de matrices de enteros. Eso suena gracioso. De todos modos, thePieces.length es válido, porque thePieces es una matriz de algún tipo.Al eliminar la referencia de la matriz, así:

thePieces[index] 

Se obtiene una matriz de matrices de enteros, que se puede llamar longitud en adelante, ya que es una matriz de algo. SO:

thePieces[index0][index1] 

es una matriz de enteros, que se puede llamar a la longitud de (espero que vea un patrón por ahora).

thePieces[index0][index1][index2] 

Le da un int sin formato, que no tiene una propiedad de longitud.

Corrí mi código de pieza y obtuve 2. Tengo ni idea de por qué son dos. ¿Es porque yo tengo dos juegos en el tercer nivel? I espera obtener cuatro debido a los cuatro conjuntos de puntos.

llame:

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

que imprime 2 porque thePieces [0] apunta a esta matriz:

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

cual se devolvía 4 (si se llama a thePieces [0] .length) Sin embargo, thePieces [0] [0] apunta a:

{0, 0} 

que tiene longitud de 2.

+0

Ahora lo entiendo, creo. Si utilicé [] [] [] No tengo más longitud que un valor porque esa es la referencia a un elemento específico en la matriz de matrices de matrices. Podría usar (supongo) int myInt = thePieces [0] [1] [0] pero no .length por las razones que usted indicó. De hecho, es la única manera de obtener un valor y todas las demás formas además de [] [] [] deben usar la longitud (o tal vez algo más significativo para las matrices) porque solo apuntan a una matriz en algún nivel (matriz de matriz de array, array of array, array). – johnny

0

Como han dicho en los otros carteles, estás en lo correcto al pensar que debería ser la salida '22'.

Como nota al margen, a menos que tenga un specific reason not to, debería considerar el uso de una de las colecciones de Java en lugar de una matriz. Tal vez un Vector de Vectores (es decir: Vector<Vector<Integer>>). No es incorrecto utilizar una matriz, sin embargo, personalmente, me resulta mucho más fácil trabajar con Colecciones que con Matrices.

+0

Espero probar eso después de que entiendo cómo usar las matrices. Gracias. – johnny

Cuestiones relacionadas