Matriz de matrices

P: ¿Cómo utilizo una matriz de matrices?

UN:

String s = new String ("Hola, mundo"); // s es una referencia de cadena, que se refiere a un // objeto de cadena con el valor "Hola, mundo". s = nueva cadena ("Etiqueta Guten, Welt"); // Las mismas referencias de String ahora se refieren // a un objeto String diferente; es decir, // una única referencia se ha referido a dos // objetos diferentes (consecutivamente). // (Observe que ahora tenemos un objeto String // con valor "Hello, World", que no tiene // referencias; por lo tanto, este objeto es elegible // para ser recolectado como basura) String t; // t es una referencia de cadena con un valor nulo // (no se refiere a ningún objeto). // Si intenta usar t en este punto, por ejemplo, // diciendo int len ​​= t.length; obtendrá una // NullPointerException (debería llamarse // NullReferenceException). t = s;// La referencia de cadena t ahora se refiere al mismo // objeto al que se hace referencia en la referencia de cadena s, // a saber, un objeto de cadena con el valor "Guten Tag, Welt". // Entonces aquí tenemos dos // referencias a un solo objeto (al mismo tiempo).

Las matrices en Java son objetos por derecho propio, ya sea que contengan primitivas ( ints, chars, booleans, etc.) o contengan otros objetos. Esto significa que las matrices se denominan como cualquier otro objeto, con la adición de la []semántica de agregación / desreferencia. He aquí un ejemplo:

String [] sa; // sa es una referencia nula // intentar acceder a sa.length provoca una NullPointerException. sa = nueva Cadena [2]; // sa ya no es una referencia nula, se refiere a un objeto // específico que es una matriz de dos referencias de String nulas. // sa.length ahora es igual a 2 // (sa [0] y sa [1] son ​​las dos referencias de String nulas). sa [0] = "Hola, mundo"; sa [1] = "Etiqueta Guten, Welt"; // Ahora sa se refiere a una matriz de dos referencias String no nulas. sa = nueva Cadena [1]; // sa.length es igual a 1 // La misma referencia sa ahora se refiere a una matriz diferente // (y más corta). // sa [0] es una referencia de cadena nula // intentar acceder a sa [1] provoca una // ArrayIndexOutOfBoundsException. sa [0] = "Hola, mundo"; // sa [0] ahora no es nulo.

Su pregunta sobre las matrices puede responderse considerando que

Cadena [] [] saa; saa [0] [0] = "Ayuda";

causará a NullPointerException, porque saaes una referencia nula, es decir, saano se refiere a ningún objeto. Para asignar un valor al primer elemento de la primera matriz, saadebe hacer referencia a una matriz de con una longitud mayor que cero y saa[0]debe referirse a una matriz de cadena no nula cuya longitud también es mayor que cero. Entonces, uno podría comenzar diciendo:

Cadena [] [] saa; // saa es una referencia nula a una matriz de matrices de cadenas // Intentar saa.length ya causa una NullPointerException, // como lo hace intentar saa [0]. saa = nueva Cadena [1] []; // saa ahora se refiere a una matriz de 1 referencia nula a una Cadena []. // saa.length es igual a 1. // saa [0] es nulo. saa [0] = nueva cadena [2]; // saa ahora se refiere a una matriz de 1 referencia no nula // a un String [] de longitud 2. // saa.length sigue siendo igual a 1. // saa [0] .length es igual a 2 (pero saa [0] [0] y // saa [0] [1] son ​​ambos nulos). saa [0] [0] = "Hola, mundo"; saa [0] [1] = "Etiqueta Guten, Welt"; // Ahora saa [0] [0] y saa [0] [1] son ​​ambos no nulos.

Tenga en cuenta que no puede hacer referencia a saa[0][0]hasta que no saa[0]sea ​​nulo, y no puede hacer que no sea saa[0]nulo hasta que no lo haga saa. Básicamente, debe construir su matriz de matrices de forma incremental.

Existe una abreviatura fácil de usar para inicializar referencias de matriz:

String [] [] saa = {{{"Hello, World}, {" Guten Tag, Welt "}}}; // esto crea un objeto String [] [] como el creado // arriba, y asigna saa a referirse a ese objeto. // El espacio en blanco está destinado a enfatizar que el // objeto creado es una matriz de una Cadena [] que // contiene dos cadenas. 

Usando esta abreviatura, nuestro ejemplo podría escribirse correctamente como:

String [] [] saa = {{{"Ayuda"}}}; 

Sin embargo, esto hace que se haga saareferencia a una matriz de cadenas una por una. Tenga en cuenta que la sintaxis anterior solo funciona al inicializar una referencia de matriz (la inicialización es el caso especial de asignación en el momento de la declaración). La forma más general de crear una nueva matriz y asignarla a una referencia de matriz nueva o existente se ve así (en el caso de una referencia existente):

saa = new String [] [] {// note el vacío [] [] - el compilador calcula el // tamaño (se requiere vacío [] []). {{"Hello"}, {"World"}} // esto es saa [0], // observe la coma que separa saa [0] y saa [1] {{"Guten Tag"}, {"Welt"} } // esto es saa [1]}; // ahora saa.length = 2, y saa [0] y saa [1] también tienen una longitud 2
Random Walk Computing es la boutique de consultoría Java / CORBA más grande de Nueva York, que se enfoca en soluciones para la empresa financiera. Conocidos por su experiencia de vanguardia en Java, los consultores de Random Walk publican y hablan sobre Java en algunos de los foros más respetados del mundo.

Esta historia, "Array of arrays" fue publicada originalmente por JavaWorld.