Una tabla dentada no es más que una tabla cuyos elementos son a su vez
tablas, pudiéndose así anidar cualquier número de tablas. Para declarar tablas
de este tipo se usa una sintaxis muy similar a la explicada para las tablas
unidimensionales solo que ahora se indican tantos corchetes como nivel de
anidación se desee. Por ejemplo, para crear una tabla de tablas de elementos de
tipo int
formada por dos elementos, uno de los cuales fuese una tabla de elementos de
tipo int
formada por los elementos de valores 1,2 y el otro fuese una tabla de elementos
de tipo int
y valores 3,4,5, se puede hacer:
int[][] tablaDentada = new int[2][]
{new int[] {1,2}, new int[] {3,4,5}};
Como se indica explícitamente
cuáles son los elementos de la tabla declarada no hace falta indicar el tamaño
de la tabla, por lo que la declaración anterior es equivalente a:
int[][] tablaDentada = new int[][]
{new int[] {1,2}, new int[] {3,4,5}};
Es más, igual que como se vió con
las tablas unidimensionales también es válido hacer:
int[][] tablaDentada = {new int[]
{1,2}, new int[] {3,4,5}};
Si no quisiésemos indicar cuáles
son los elementos de las tablas componentes, entonces tendríamos que indicar al
menos cuál es el número de elementos que podrán almacenar (se inicializarán con
valores por defecto) quedando:
int[][] tablaDentada = {new int[2],
new int[3]};
Si no queremos crear las tablas
componentes en el momento de crear la tabla dentada, entonces tendremos que
indicar por lo menos cuál es el número de tablas componentes posibles (cada una
valdría null),
con lo que quedaría:
int[][] tablaDentada = new int[2][];
Es importante señalar que no es
posible especificar todas las dimensiones de una tabla dentada en su definición
si no se indica explícitamente el valor inicial de éstas entre llaves. Es
decir, esta declaración es incorrecta:
int[][] tablaDentada = new
int[2][5];
Esto se debe a que el tamaño de
cada tabla componente puede ser distinto y con la sintaxis anterior no se puede
decir cuál es el tamaño de cada una. Una opción hubiese sido considerar que es
5 para todas como se hace en Java, pero ello no se ha implementado en C# y
habría que declarar la tabla de, por ejemplo, esta manera:
int[][] tablaDentada = {new int[5], new int[5]);
Finalmente, si sólo queremos
declarar una variable tabla dentada pero no queremos indicar su número de
elementos, (luego la variable valdría null), entonces basta poner:
int[][]
tablaDentada;
Hay que precisar que aunque en
los ejemplos hasta ahora presentes se han escrito ejemplos basados en
tablas dentadas de sólo dos niveles de
anidación, también es posible crear tablas dentadas de cualquier número de
niveles de anidación. Por ejemplo, para una tabla de tablas de tablas de enteros
de 2 elementos en la que el primero fuese una tabla dentada formada por dos
tablas de 5 enteros y el segundo elemento fuese una tabla dentada formada por
una tabla de 4 enteros y otra de 3 se podría definir así:
int[][][] tablaDentada = new
int[][][] { new int[][] {new int[5], new int[5]},
new int[][] {new int[4], new int[3]}};
A la hora de acceder a los
elementos de una tabla dentada lo único que hay que hacer es indicar entre
corchetes cuál es el elemento exacto de las tablas componentes al que se desea
acceder, indicándose un elemento de cada nivel de anidación entre unos
corchetes diferentes pero colocándose todas las parejas de corchetes juntas y
ordenadas de la tabla más externa a la más interna. Por ejemplo, para asignar
el valor 10 al elemento cuarto de la tabla que es elemento primero de la tabla
que es elemento segundo de la tabla dentada declarada en último lugar se haría:
tablaDentada[1][0][3]
= 10;