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. Multi

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: Multi2

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 2

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 3

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 2

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