JavaRush /Blog Java /Random-ES /matrices multidimensionales

matrices multidimensionales

Publicado en el grupo Random-ES
Matrices multidimensionales - 1

¿Qué es una matriz Java unidimensional?

Una matriz es un conjunto ordenado de elementos del mismo tipo, primitivo o de referencia. Puede encontrar información general sobre matrices (en su mayoría unidimensionales) en el artículo " Matrices en Java " y en el curso JavaRush . En este artículo hablaremos de arreglos cuyos elementos son otros arreglos. Estas matrices se denominan multidimensionales. Una matriz cuyos elementos son otras matrices, es decir, una matriz de matrices, se denomina bidimensional. No todos los lenguajes tienen matrices multidimensionales estructuradas de esta manera, pero en Java este es el caso.

Matrices multidimensionales de Java, sintaxis general

En general, las matrices multidimensionales en Java tienen este aspecto:
Data_type[dimension1][dimension2][]..[dimensionN] array_name = new data_type[size1][size2].[sizeN];
¿ Dónde Data_typeestá el tipo de elementos de la matriz? Puede ser primitivo o de referencia (clase). El número de pares de corchetes con dimensionel interior es la dimensión de la matriz (en nuestro caso - N). array_name— nombre de la matriz size1...sizN: número de elementos en cada dimensión de la matriz. Declarando matrices multidimensionales:
int[][] twoDimArray; //matriz bidimensional
String[][][] threeDimArray; //matriz tridimensional
double[][][][][] fiveDimArray; // matriz de cinco dimensiones
Quizás todo esto parezca muy abstracto, así que pasemos ahora a las manifestaciones concretas de matrices multidimensionales: bidimensionales y tridimensionales. El hecho es que los desarrolladores de Java a veces utilizan matrices bidimensionales, y mucho menos: tridimensionales, e incluso matrices más grandes son extremadamente raras. Existe una alta probabilidad de que no los encuentre.

Arreglos multidimensionales en el curso JavaRush

En JavaRush, las matrices "ordinarias" se inician en el nivel 7 de la misión de sintaxis de Java y, más adelante en el curso, se encuentran más de una vez. A veces, a lo largo del curso te encuentras con problemas que involucran matrices bidimensionales (o que se pueden resolver con su ayuda). Las matrices bidimensionales también se utilizan en el motor de juego de la sección especial " Juegos en JavaRush ". Si aún no has estado ahí, echa un vistazo y crea uno o dos juegos. Los términos y condiciones vienen con instrucciones detalladas y brindarán una excelente capacitación en habilidades de programación. La matriz tridimensional se puede encontrar en el juego Space Invaders . A través de él, se especifica un conjunto de cuadros para la animación (y cada uno de estos cuadros es una matriz bidimensional). Si ya completó la búsqueda de JavaSyntax o simplemente se siente seguro en la programación Java, intente escribir su propia versión de este juego clásico.

¿Qué es una matriz Java bidimensional?

Una matriz bidimensional en Java es una matriz de matrices, es decir, cada celda contiene una referencia a una matriz. Pero es mucho más fácil presentarlo en forma de tabla que tenga un número determinado de filas (primera dimensión) y un número de columnas (segunda dimensión). Una matriz bidimensional en la que todas las filas tienen el mismo número de elementos se llama rectangular.

Declarar, crear e inicializar matrices bidimensionales

El procedimiento para declarar y crear una matriz bidimensional es casi el mismo que en el caso de una unidimensional:
int[][] twoDimArray = new int[3][4];
Esta matriz tiene 3 filas y 4 columnas. El tamaño de una matriz bidimensional rectangular (puede que no sean rectangulares, más sobre esto a continuación), es decir, el número total de elementos se puede determinar multiplicando el número de filas por el número de columnas. Ahora está inicializado (rellenado) con valores predeterminados. Es decir, ceros. Llenémoslo con los valores que necesitamos.
twoDimArray[0][0] = 5;//escribe el valor 5 en la celda en la intersección de la fila cero y la columna cero
twoDimArray[0][1] = 7; //escribe el valor 7 en la celda en la intersección de la fila cero y la primera columna
twoDimArray[0][2]  = 3;
twoDimArray[0][3] = 17;
twoDimArray[1][0] = 7;
twoDimArray[1][1] = 0;
twoDimArray[1][2] = 1;
twoDimArray[1][3] = 12;
twoDimArray[2][0] = 8;
twoDimArray[2][1] = 1;
twoDimArray[2][2] = 2;
twoDimArray[2][3] = 3;
Al igual que con las matrices unidimensionales, puedes realizar el procedimiento de inicialización más rápido:
int [][] twoDimArray = {{5,7,3,17}, {7,0,1,12}, {8,1,2,3}};
En ambos casos, obtendremos una matriz bidimensional con tres filas y cuatro columnas, llena de números enteros. Matrices multidimensionales - 2

Mostrar una matriz bidimensional en la pantalla

La forma más lógica de realizar esta operación es generar primero la línea cero elemento por elemento, luego la segunda, y así sucesivamente. La forma más común de generar una matriz bidimensional en Java es utilizar dos bucles anidados.
int [][] twoDimArray = {{5,7,3,17}, {7,0,1,12}, {8,1,2,3}};// declaró una matriz y la llenó con elementos
for (int i = 0; i < 3; i++) {  //pasar por las lineas
            for (int j = 0; j < 4; j++) {//pasar por las columnas
                System.out.print(" " + twoDimArray[i][j] + " "); //elemento de salida
            }
            System.out.println();// ajuste de línea para la preservación visual de la forma tabular
        }

Salida rápida de una matriz bidimensional

La forma más corta de mostrar una lista de elementos de una matriz bidimensional en la pantalla es utilizar el método deepToStringde clase Arrays. Ejemplo:
int[][] myArray = {{18,28,18},{28,45,90},{45,3,14}};
System.out.printLn(Arrays.deepToString(myArray));
El resultado del programa es el siguiente: [[18, 28, 18], [28, 45, 90], [45, 3, 14]]

“Longitudes” de una matriz bidimensional

Para obtener la longitud de una matriz unidimensional (es decir, la cantidad de elementos que contiene), puede usar la variable length. Es decir, si definimos un array int a[] = {1,2,3}, entonces la operación a.lengthdevuelve 3. Pero ¿y si aplicamos el mismo procedimiento a nuestro array bidimensional?
int [][] twoDimArray = {{5,7,3,17}, {7,0,1,12}, {8,1,2,3}};
System.out.println(twoDimArray.length);
Salida: 3 Entonces esta operación genera el número de filas en la matriz. ¿Cómo obtener el número de columnas? Si se trata de matrices bidimensionales rectangulares (es decir, aquellas en las que todas las líneas tienen la misma longitud), entonces podemos aplicar la operación twoDimArray[0].lengtho, en lugar del elemento cero (esencialmente, la línea cero), cualquier otro existente. Podemos hacer esto porque en Java, una matriz bidimensional es una matriz de matrices y el elemento cero twoDimArray[0]es una matriz de longitud 4. Puede comprobarlo usted mismo.

Ejemplo de uso de una matriz bidimensional: tablero de ajedrez

Se pueden utilizar matrices bidimensionales para crear cualquier campo bidimensional finito, por ejemplo en juegos y, en particular, en ajedrez. Es fácil pensar en un tablero de ajedrez como una matriz bidimensional. Puede "adjuntar" gráficos a esto, pero por ahora, definamos un tablero de ajedrez usando símbolos y enviémoslo a la consola. Matrices multidimensionales - 3El cuadrado inferior izquierdo del tablero de ajedrez está pintado de negro, el siguiente es blanco, al igual que el de arriba. Entonces, el color cambia cada vez que te mueves a una celda adyacente al lado. Para configurar el color del ajedrez no manualmente, sino mediante un algoritmo, puede utilizar una verificación de paridad: si la suma de los índices de fila y columna es par o cero, entonces la celda será blanca; de lo contrario, será negra. Para esta verificación, utilizamos el operador restante % en el algoritmo. Como no estamos trabajando con gráficos, sino con símbolos, denotaremos la celda blanca con la letra W(blanca) y la celda negra con la letra B(negra).
//establecer el tablero de ajedrez como una matriz bidimensional
String [][] chessBoard = new String[8][8];
        for (int i = 0; i< chessBoard.length; i++) {
            for (int j = 0; j < chessBoard[0].length; j++) {
                if ((i + j) % 2 == 0) chessBoard[i][j] = "W";
                else chessBoard[i][j] = "B";
            }
        }
El resultado del programa es el siguiente: WBWBWBWBBWBWBWBWWBWBW BWBBWBWBWBWWBWBWBWBBW BWBWBWWBWBWBWBBWBWBWB W Todo es como en un tablero de ajedrez real, puedes comprobarlo. Matrices multidimensionales - 4Ahora escribamos un método para numerar celdas correctamente, no en lenguaje de matrices, sino en lenguaje de "ajedrez". La celda inferior izquierda del tablero se llama A1, mientras que en nuestra matriz se llama chessBoard[7][0]. Asociemos cada par de índices de una matriz bidimensional con su equivalente en "ajedrez". Para hacer esto, usamos dos líneas: " abcdefgh" y " 87654321" (en orden inverso, por simplicidad, de modo que el tablero de ajedrez 8 corresponda a la columna cero).
public static String chessBoardCoord(int a, int b) {
            String letters = "abcdefgh";
            String numbers = "87654321";
            if ((a > 7)|| (b>7)) return null; //si el número está fuera del tablero, devuelve el valor predeterminado - nulo
            else return (Character.toString(letters.charAt(a)) + numbers.charAt(b)); /*charAt - un método con el que extraemos de la cadena el elemento bajo el número pasado, aquí - bajo los números a y b. Character.toString: un método que convierte el carácter recibido en una cadena */
        }
Ahora mostremos en cada celda no solo su color, sino también su número, usando el métodochessBoardCoord
String [][] chessBoard = new String[8][8];
        for (int i = 0; i < chessBoard.length; i++) {
            for (int j = 0; j < chessBoard[0].length; j++) {
                if ((i + j) % 2 == 0) chessBoard[i][j] = "W" + chessBoardCoord(j,i);
                else chessBoard[i][j] = "B"+ chessBoardCoord(j,i);
            }
        }

            for (int i = 0; i < chessBoard.length; i++) {
                for (int j = 0; j < chessBoard[0].length; j++) {
                    System.out.print(" " + chessBoard[i][j] + " ");
                }
                System.out.println();
            }
Salida del programa: Wa8 Bb8 Wc8 Bd8 We8 Bf8 Wg8 Bh8 Ba7 Wb7 Bc7 Wd7 Be7 Wf7 Bg7 Wh7 Wa6 Bb6 Wc6 Bd6 We6 Bf6 Wg6 Bh6 Ba5 Wb5 Bc5 Wd5 Be5 Wf5 Bg5 Wh5 Wa4 Bb4 Wc4 Bd4 We4 Bf4 Wg4 Bh4 Ba3 Wb3 Bc3 Wd 3 Ae3 Wf3 Bg3 Wh3 Wa2 Bb2 Wc2 Bd2 We2 Bf2 Wg2 Bh2 Ba1 Wb1 Bc1 Wd1 Be1 Wf1 Bg1 Wh1 Donde We2significa el cuadrado blanco numerado e2.

Ejemplo de uso de una matriz bidimensional: multiplicación de matrices

¡Atención!Este ejemplo requiere conocimientos básicos de matrices. Aquí se dirá muy poco sobre ellos, y esta información está destinada a aquellos que han estudiado, pero han olvidado un poco, la aritmética matricial. Sin embargo, este conocimiento se puede obtener de fuentes abiertas, en particular de un artículo de Wikipedia . Este es un buen ejemplo del uso de matrices bidimensionales, pero podemos seguir adelante sin él. Entonces, si ahora te parece incomprensible desde un punto de vista matemático y realmente no quieres profundizar en ello, no dudes en saltarte el ejemplo. Si has estudiado álgebra lineal básica, es posible que hayas aprendido acerca de los arreglos rectangulares como matrices rectangulares. Matrices multidimensionales - 5Donde a11, a12... aNN son algunos números. En la figura, la matriz ni siquiera es rectangular, sino cuadrada (el número de filas es igual al número de columnas, pero no siempre es así). En la vida real, estas matrices rara vez se encuentran, pero en programación e informática son muy comunes. En particular, se utilizan en gráficos por computadora y motores de juegos. Por ejemplo, la rotación de un objeto en la pantalla en cualquier ángulo se puede programar utilizando una matriz de rotación. En el espacio bidimensional, la matriz de rotación se ve así: Matrices multidimensionales - 6donde theta es el ángulo que debe girar el objeto. Se pueden sumar matrices de dimensiones iguales entre sí y la suma se produce elemento por elemento (agregamos elementos con los mismos índices). Pero la operación de multiplicación de matrices es menos familiar. Por tanto, las matrices se pueden multiplicar y obtener una matriz resultante sólo si el número de columnas de la primera matriz coincide con el número de filas de la segunda. La matriz resultante tendrá el mismo número de filas que la primera y el mismo número de columnas que la segunda. La multiplicación se realiza de la siguiente manera. Tengamos una matriz a[l][m]y b[m][n]. Como resultado de su multiplicación, deberíamos obtener una matriz c[l][n]. Para obtener un elemento de c[0][0]una matriz producto, es necesario a[0][0]multiplicar el elemento cero de la fila cero de la primera matriz por el elemento cero de la segunda matriz, luego multiplicar el primer elemento de la primera fila de la primera matriz por el primer elemento. de la primera columna de la segunda matriz, y así sucesivamente, tras lo cual se añaden todos los productos resultantes.

a[0][0]*b[0][0] + a[0][1]*b[1][0] + … + a[0][m-1]*b[m-1][0]
Para obtener el segundo elemento de la primera fila de la matriz de resultados, realizamos el mismo procedimiento con la segunda fila

a[1][0]*b[0][0] + a[1][1]*b[0][1] + … + a[0][m-1]*b[m-1][0]
Y así hasta el final de la línea. Luego pasamos a la siguiente línea y repetimos el procedimiento hasta quedarnos sin líneas. Es decir, multiplicamos las filas de la primera matriz por las columnas de la segunda matriz. A continuación se muestra el código para la multiplicación de matrices. Puede complementarlo con una verificación del cumplimiento de la condición mencionada anteriormente en cuanto al número de filas y columnas.
//declarando dos matrices
int [][] twoDimArray1 = {{1,0,0,0},{0,1,0,0},{0,0,0,0}};
int[][] twoDimArray2 = {{1,2,3},{1,1,1},{0,0,0},{2,1,0}};

// proceso de multiplicación de matrices
int[][]twoDimArray3 = new int [twoDimArray1.length][twoDimArray2[0].length];
        for (int i=0; i<twoDimArray3[0].length; i++)
            for (int j=0; j<twoDimArray3.length; j++)
                for (int k=0; k<twoDimArray1[0].length; k++)
                              twoDimArray3[i][j] = twoDimArray3[i][j] + twoDimArray1[i][k] * twoDimArray2[k][j];

// salida en pantalla
        for (int i = 0; i < twoDimArray3.length; i++) {
            for (int j = 0; j < twoDimArray3[0].length; j++) {
                System.out.print(" " + twoDimArray3[i][j] + " ");
            }
            System.out.println();
        }
El programa genera el siguiente resultado: 1 2 3 1 1 1 0 0 0

Matrices bidimensionales no rectangulares

Dado que las matrices bidimensionales son matrices de matrices en Java, cada una de las matrices internas puede tener diferentes longitudes. Al crear una matriz, solo podemos especificar el número de filas y no el número de columnas (es decir, de hecho, la longitud de esas mismas filas). Veamos un ejemplo.
//declarar y crear una matriz, especificando solo el número de filas
int [][] twoDimArray = new int[5][];

//inicializar la matriz, llenándola con matrices de diferentes longitudes
        twoDimArray[0] = new int[]{1, 2, 3, 4, 5};
        twoDimArray[1] = new int[]{1,2,3,4};
        twoDimArray[2] = new int[]{1,2,3};
        twoDimArray[3] = new int[]{1,2};
        twoDimArray[4] = new int[]{1};
//muestra la matriz bidimensional no rectangular resultante en la pantalla
        for (int i = 0; i < twoDimArray.length; i++) {
            for (int j = 0; j < twoDimArray[i].length; j++) {
                System.out.print(" " + twoDimArray[i][j] + " ");
            }
            System.out.println();
        }
Salida del programa: 1 2 3 4 5 1 2 3 4 1 2 3 1 2 1 Por lo tanto, la línea cero de nuestra matriz contiene la matriz {1,2,3,4,5}y la cuarta línea contiene la matriz {1}.

Matrices tridimensionales en Java

Siguiendo el sentido común y la lógica del lenguaje Java, una matriz tridimensional puede denominarse "matriz de matrices de matrices" o "una matriz en la que cada elemento es una matriz bidimensional". Además, estas matrices bidimensionales pueden ser diferentes. Ejemplo:
// crea una matriz tridimensional que consta de dos matrices bidimensionales
int[][][] threeDimArr = new int[2][][];
//crear la primera matriz 2D de una matriz 3D de 5x2
        threeDimArr[0] = new int[5][2];
//crear una segunda matriz 2D de una matriz 3D 1x1
        threeDimArr[1] = new int[1][1];
Pero más a menudo en la práctica hay matrices tridimensionales en las que las tres cantidades se definen a la vez, un análogo de las matrices rectangulares bidimensionales. Matrices multidimensionales - 7Como ya mencionamos, rara vez se utilizan matrices tridimensionales o más. Sin embargo, puedes programar algo interesante con una matriz 3D. Por ejemplo, un aparcamiento de varias plantas. Cada piso puede considerarse un conjunto bidimensional y una plaza de aparcamiento puede considerarse un elemento específico de un conjunto tridimensional. Un elemento de dicha matriz se puede representar mediante un tipo booleancon el valor falso si el espacio está libre y verdadero si el espacio está ocupado.
// establecer una matriz tridimensional booleana. Este aparcamiento tiene 3 plantas, cada una de las cuales tiene capacidad para 2x5 = 10 coches. Por defecto, todas las celdas están vacías (falso)
boolean[][][] parkingLot = new boolean[3][2][5];
//llegaron dos autos y se estacionaron en la planta baja en la celda [1][0] y [1][3]
        parkingLot[0][1][0] = true;
        parkingLot[0][1][3] = true;

// Envía la matriz a la consola
        for (int i = 0; i < 3; i++) {
            for (int j = 0; j < 2; j++) {
                for (int k = 0; k < 5; k++) {
                    System.out.print("arr[" + i + "][" + j + "][" + k + "] = " + parkingLot[i][j][k] + "\t");

                }
                System.out.println();
            }
        }

Arreglos multidimensionales en el trabajo real de un programador Java.

En realidad, la mayoría de los desarrolladores de Java no encuentran matrices multidimensionales con mucha frecuencia. Sin embargo, hay una serie de tareas para las que esta estructura de datos es muy adecuada.

  1. Para pruebas y configuración de matrices como constantes para verificar un algoritmo particular.
  2. A veces se utilizan matrices multidimensionales para redes neuronales.
  3. Las matrices multidimensionales son adecuadas para archivadores.
  4. Trabajando con imágenes.

Problemas interesantes sobre matrices bidimensionales y tridimensionales.

Sabe lo suficiente sobre matrices multidimensionales en Java y, si se siente seguro, puede intentar resolver algunos de los problemas siguientes. No son fáciles, pero sí interesantes. Tres en raya. Monta un campo de 3x3, crea dos jugadores que se turnen. Inicialmente, el campo está vacío, y en cada uno de los campos vacíos el primer jugador puede poner una cruz y el segundo un cero. Gana el que primero consigue tres cruces o tres ceros dispuestos en una fila, una columna o en diagonal. Hormiga de Langton . Hay un campo determinado, dividido en celdas (una matriz bidimensional), pintada de negro o blanco (se puede configurar mediante una función aleatoria). Una "hormiga" se materializa aleatoriamente en una de las celdas y, en cada paso, puede moverse en una de las cuatro direcciones hacia la celda adyacente, horizontal o verticalmente. Reglas de movimiento de hormigas:
  • En un cuadrado negro, la hormiga debe girar 90° hacia la izquierda, cambiar el color de su celda a blanco y luego avanzar al siguiente cuadrado.
  • En un cuadrado blanco, la hormiga gira 90° hacia la derecha y cambia el color de su celda a negro, luego avanza hasta el siguiente cuadrado.
Escribe un método que calcule la iteración en el paso número ndada la posición inicial de la hormiga. El campo se puede llenar aleatoriamente con ceros y unos (o denotar con las letras Wy B, como hicimos en el ejemplo del tablero de ajedrez). También necesitamos dos parámetros más: la posición horizontal y vertical de la hormiga, así como su dirección en este paso (norte, sur, oeste, este), mientras que, de forma predeterminada, la hormiga mira hacia el norte. Puedes intentar modelar un cubo de Rubik utilizando matrices tridimensionales. Un cubo de Rubik estándar tiene 6 caras y cada una de ellas es una matriz tridimensional de cuadrados de colores Color[][][] rubik = new Color[6][3][3]. Sin embargo, implementar un cubo de Rubik no es una tarea baladí.

Materiales útiles sobre matrices.

Muchos artículos sobre JavaRush están dedicados a matrices (principalmente unidimensionales, ya que se utilizan con mucha más frecuencia en la práctica). Présteles atención.
  1. Matrices en Java : acerca de matrices para principiantes con ejemplos
  2. Algo sobre matrices : buen artículo detallado sobre matrices
  3. La clase Arrays y su uso : el artículo describe algunos métodos de la claseArray
  4. Arrays es la primera conferencia de JavaRush dedicada a los arrays.
  5. Devuelve una matriz de longitud cero, no nula : el autor de Programación efectiva, Joshua Bloch, habla sobre cómo devolver mejor matrices vacías
Comentarios
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION