Arrays Multidimensionales
Introdución
Estos arrays tienen la característica de tener más de una dimensión, es decir tendrán más de un índice para poder acceder a una posición del mismo.
El ejemplo más sencillo será el de dos dimensiones y la forma conceptual sería el de una tabla con columnas y filas.
Para Java no es más que un array de arrays.
Declaración
La declaración es igual que con los arrays unidimensionales, pero con más par de corchetes “[]”, un par por cada dimensión:
tipo [][]…[] nombre_array = new tipo [cap1][cap2]…[capn];
Para crear un array de dos dimensiones de dos filas y tres columnas de “doubles”:
double [][] tabla = new double [2][3];
El acceso a una posición a partir de los dos indices:
Acceso y modificación o escritura
int[][] myNumbers = { {1, 2, 3, 4}, {5, 6, 7} };
System.out.println(myNumbers[1][2]); // Outputs 7
myNumbers[1][2] = 9;
System.out.println(myNumbers[1][2]);
Inicialización
También podemos inicializar con valores en la declaración de un array multidimensional, se usarán las llaves “{}” para agrupar los elementos de cada dimensión, y cada dimensión separado por “,”. Ejemplo:
double [][] tabla = {
{3.6, 8.2, 12,1},
{4.0, 23.4, 11}
};
Extra: podemos crear array irregulares y sólo tendremos que declarar el tamaño de la primera dimensión -> enlace.
Recorrer
Para recorrer array de más de una dimensión siempre habrá que programar un bucle por cada dimensión, y normalmente anidados. Se suelen utilizar for o for-each:
int[][] matriz={{1,2,3},{4,5},{6,7,8,9,10},{11}};
for(int i=0;i<matriz.length;i++){
for(int j=0;j<matriz[i].length;j++){
System.out.print(matriz[i][j]);
}
}
Ejemplo de array de 3 dimensiones:
public class Array3DimensionesAleatorio {
private static Scanner entrada;
public static void main(String[] args) {
System.out.print("\n");
int array3D[][][];
int x = pedirNumeroEntero("Introduce la primera dimensión: ");
int y = pedirNumeroEntero("Introduce la segunda dimensión: ");
int z = pedirNumeroEntero("Introduce la tercera dimensión: ");
array3D = new int[x][y][z];
inicializarArray3D(array3D);
visualizar(array3D);
}
static void inicializarArray3D(int[][][] pArray){
Random r = new Random();
for(int i=0;i<pArray.length;i++){
for(int j=0;j<pArray[i].length;j++){
for(int k=0;k<pArray[i][j].length;k++){
pArray[i][j][k] = r.nextInt(11);
}
}
}
}
static void visualizar(int[][][] pArray){
int numElementos = 0, sumaElementos = 0;
for(int i=0;i<pArray.length;i++){
for(int j=0;j<pArray[i].length;j++){
for(int k=0;k<pArray[i][j].length;k++){
System.out.print("\t" + pArray[i][j][k]);
numElementos++;
sumaElementos += pArray[i][j][k];
}
System.out.print("\n");
}
System.out.print("\n\n");
}
System.out.printf("La media de los elementos es %.2f", (double)sumaElementos/numElementos);
}
static int pedirNumeroEntero(String s){
int num;
entrada = new Scanner(System.in);
do {
System.out.print(s);
num = entrada.nextInt();
if(num<=0){
System.out.println("La dimensión de la matriz debe ser mayor que 0.\n");
}
} while (num<=0);
return num;
}
}
Clase Arrays
La API de Java incluye la clase java.util.Arrays que ofrece una funcionalidades muy prácticas con sus métodos estáticos. Estos son los más importantes:
- static String toString ( tipo[] array): imprime los elementos del array.
- static void fill (tipo[] array, tipo valor): inicializa el array con el valor que se le pasa.
- static boolean equals (tipo[] array, tipo[] arrayb): compara uno a uno los elementos de los dos arrays.
- static void sort (tipo[] array): ordena ascendentemente el array.
- static tipo[] copyOf (tipo[] array, int len): devuelve un nuevo array de len elementos inicializados con los valores de array.
- hay muchos más descúbrelos!
Ejercicio 1
class Unidad4 {
public static void main(String args[]){
int[][] arrayDosD= new int[3][];
arrayDosD[0]=new int[4];
arrayDosD[1]=new int[2];
arrayDosD[2]=new int[3];
System.out.println("cargamos e imprimimos arrayDosD[0]. Observa que su tamaño es 4");
for(int j=0;j<4;j++){ //utilizamos la variable j pero podría ser i, z, ....
arrayDosD[0][j]=0*j + 0 + j*2; //cargamos la matriz
System.out.println("arrayDosD[0]["+ j +"]="+ arrayDosD[0][j]);
}
System.out.println("\ncargamos e imprimimos arrayDosD[1]. Observa que su tamaño es 2");
for(int j=0;j<2;j++){
arrayDosD[1][j]=1*j + 1 + j*2; //cargamos la matriz
System.out.println("arrayDosD[1]["+ j +"]="+ arrayDosD[1][j]);
}
System.out.println("\ncargamos e imprimimos arrayDosD[2]. Observa que su tamaño es 3");
//para ahondar en el concepto de referencia a array hago la ultima impresión con paso intermedio
int[] x=arrayDosD[2];
for(int j=0;j<3;j++){
x[j]=2*j + 2 + j*2; //cargamos la matriz
System.out.println("arrayDosD[2]["+ j +"]="+ x[j]);
}}}
Volver a escribir el ejemplo anterior utilizando el atributo length, lo que permite utilizar de nuevo un bucle anidado en otro y hacer un código más compacto.
Ejercicio 2
int[][] matriz ={{0,2,4},{1,3,5}};
Inicializa arrayDosD con la sintaxis anterior e imprime su contenido según el siguiente gráfico:
Ejercicio 3
Si no lo hiciste ya, vuelve a escribir el ejercicio anterior de forma que utilice el “for mejorado”. Puedes simplificar la impresión a algo del estilo de
11 12 13 14
21 22
31 32 33
Ejercicio 4
Con una matriz cuadrada, introduciendo el tamaño por argumento, inicializar aleatoriamente la matriz y luego modificarla intercambiando la diagonal principal con la secundaria. Ejemplo:
Ejercicio 5
Con una matriz cuadrada, introduciendo el tamaño por argumento, inicializar aleatoriamente la matriz y luego modificarla invirtiendo los valores de la diagonal principal entre ellos, y los de la diagonal secundaria entre ellos:
Ejercicio 6
Como caso concreto del cuadro anterior, se pide que simules un conteo con 3 dimensiones: hora, dia y mes. Llena aleatoriamente el array y se pide:
- Que imprimas mes a mes los valores de la matriz
- Que muestres de cada mes el día con más coches
- Y al final, que muestres del 3 marzo la hora que registra el mayor conteo
Para simplificar, desprecia años bisiesto y febrero siempre tiene 28 días. Para inicializar el array supon conteo entre 0 y 999