CodeGym /Blog Java /Random-ES /Algo sobre arreglos
Autor
Volodymyr Portianko
Java Engineer at Playtika

Algo sobre arreglos

Publicado en el grupo Random-ES
¡Hola! Anteriormente, en su capacitación, hemos trabajado con objetos únicos (y tipos primitivos). Pero, ¿y si necesitamos trabajar con un grupo completo de objetos en lugar de solo uno? Por ejemplo, supongamos que queremos crear una lista de cumpleaños de todos los empleados de nuestra empresa. Debe contener 30 cadenas formateadas de la siguiente manera: "Sarah Huffman, 25 de enero" Nos beneficiaremos de una estructura de datos especial llamada matriz . Si comparamos una matriz con un objeto real, es muy similar a la bóveda de un banco con cajas de seguridad: Algo sobre arreglos - 1una matriz también consta de "cajas". Puedes poner algo (un elemento) en cada caja. Para acceder a un elemento, es necesario conocer su número de casilla (índice). Así es como se crea una matriz:

public class Main {

   public static void main(String[] args) {

       String [] birthdays = new String[10];
      
   }
}
Aquí creamos una matriz que contiene 10 elementos. Inmediatamente puede notar algunas características de la matriz:
  1. Almacena elementos de un tipo de datos bien definido . Si creamos una matriz de cadenas, no podemos almacenar nada más en ella. El tipo de datos se especifica cuando se crea la matriz . En esto se diferencia de una caja de seguridad (en la que un cliente puede guardar lo que quiera).

  2. Su tamaño debe especificarse cuando se crea la matriz . No puede indicarlo más tarde ni cambiar su tamaño después de crear la matriz .
El hecho de que estamos creando una matriz se indica mediante corchetes a ambos lados de la expresión. Se pueden especificar antes o después del nombre de la variable de referencia. De cualquier manera funcionará:

String [] birthdays = new String[10];
String birthdays [] = new String[10];
Si desea escribir algo en una matriz, debe especificar el índice del cuadro donde se escribirá el valor. Las casillas de una matriz se numeran a partir de 0. Contar a partir de cero es una práctica muy común en programación. Cuanto más rápido te acostumbres, mejor :) Algo sobre arreglos - 2 Esto significa que, si quieres poner algún valor en el primer cuadro , haz esto:

public class Main {

   public static void main(String[] args) {

       String birthdays [] = new String[10];
       birthdays[0] = "Jana Russell, March 12";
   }
}
Ahora el cumpleaños de Jana se almacena en la primera celda de nuestra matriz de cumpleaños de los empleados: puede agregar otros valores de manera similar:

public class Main {

   public static void main(String[] args) {

       String birthdays [] = new String[10];
       birthdays[0] = "Jana Russell, March 12";
       birthdays[1] = "Landon Chan, May 18";
       birthdays[7] = "Rosie Mills, January 3";
   }
}
Tenga en cuenta que agregamos el cumpleaños de Rosie a la octava casilla (no habrá olvidado por qué la casilla número 7 es la octava casilla, ¿verdad?) . Puede ver que no hemos llenado todas las otras celdas. No tenemos que escribir valores en una matriz en orden. No hay tal requisito. Por supuesto, escribir elementos en orden hace que sea mucho más fácil realizar un seguimiento de cuántas cajas están libres y cuántas están ocupadas, y evita que la matriz tenga "agujeros". Si desea obtener el contenido de una de las cajas, entonces (al igual que con una caja de seguridad) necesita saber su número. Así es como se hace:

public class Main {

   public static void main(String[] args) {

       String birthdays [] = new String[10];
       birthdays[0] = "Jana Russell, March 12";
       birthdays[1] = "Landon Chan, May 18";
       birthdays[7] = "Rosie Mills, January 3";

       String rosieBirthday = birthdays[7];
       System.out.println(rosieBirthday);
   }
}
Salida de la consola: Rosie Mills, 3 de enero Creamos una Stringvariable y le dijimos al compilador: "Encuentre el cuadro con el índice 7 en la matriz de cumpleaños y asigne el valor que contiene a la Stringvariable rosiebirthday ". Y eso es exactamente lo que hizo. Cuando trabajamos con matrices, podemos encontrar fácilmente su longitud usando una propiedad especial: longitud .

public class Main {

   public static void main(String[] args) {

       String birthdays [] = new String[10];
       birthdays[0] = "Jana Russell, March 12";
       birthdays[1] = "Landon Chan, May 18";
       birthdays[7] = "Rosie Mills, January 3";

       int birthdaysLength = birthdays.length;
       System.out.println(birthdaysLength);
   }
}
Salida de la consola: 10 Nota: La lengthpropiedad almacena el tamaño de la matriz, no la cantidad de cajas que están llenas. Nuestra matriz solo almacena 3 valores, pero indicamos su tamaño como 10 cuando la creamos. Y este es exactamente el valor que lengthdevuelve el campo. ¿Por qué sería útil esto? Bueno, supongamos que desea mostrar una lista de todos los cumpleaños (para verificar que nadie se olvida). Puedes hacer esto en un bucle simple:

public class Main {

   public static void main(String[] args) {

       String birthdays [] = new String[10];
       birthdays[0] = "Jana Russell, March 12";
       birthdays[1] = "Landon Chan, May 18";
       birthdays[2] = "Jeremiah Leonard, July 12";
       birthdays [3] = "Kenny Russo, September 7";
       birthdays[4] = "Tommie Barnes, November 9";
       birthdays [5] = "Roman Baranov, August 14";
       birthdays [6] = "Chanice Andersen, April 1";
       birthdays[7] = "Rosie Mills, January 3";
       birthdays [8] = "Keenan West, October 19";
       birthdays [9] = "Abraham McArthur, May 3";

       for (int i = 0; i < birthdays.length; i++) {
           System.out.println(birthdays[i]);
       }
   }
}
En el ciclo, declaramos la variable i, que se inicializa a cero. En cada paso, obtenemos el elemento con el índice i de nuestra matriz y mostramos su valor. El ciclo hará 10 iteraciones, e i aumentará de 0 a 9, ¡y resulta que los números son los índices de los elementos de nuestra matriz! Como resultado, mostraremos todos los valores desde cumpleaños[0] hasta cumpleaños[9] . En realidad, hay otra manera de crear una matriz. Por ejemplo, puede crear una matriz de ints como esta:

public class Main {

   public static void main(String[] args) {
       int numbers [] = {7, 12, 8, 4, 33, 79, 1, 16, 2};
   }
}
Esta técnica se llama "inicialización de accesos directos". Es bastante conveniente, porque simultáneamente creamos una matriz y la llenamos con valores. No tenemos que especificar explícitamente el tamaño de la matriz: con la inicialización de acceso directo, el lengthcampo se configura automáticamente.

public class Main {

   public static void main(String[] args) {
       int numbers [] = {7, 12, 8, 4, 33, 79, 1, 16, 2};
       System.out.println(numbers.length);
   }
}
Salida de la consola: 9 Ahora, un poco sobre cómo se almacenan las matrices en la memoria. Digamos que tenemos una matriz de tres Catobjetos:

public class Cat {

   private String name;

   public Cat(String name) {
       this.name = name;
   }

   public static void main(String[] args) {

       Cat[] cats = new Cat[3];
       cats[0] = new Cat("Thomas");
       cats[1] = new Cat("Behemoth");
       cats[2] = new Cat("Lionel Messi");
   }
}
Necesitas entender algunas cosas aquí:
  1. En el caso de las primitivas, una matriz almacena un conjunto de valores específicos (por ejemplo, ints). En el caso de los objetos, una matriz almacena un conjunto de referencias .
    La catsmatriz consta de tres elementos, cada uno de los cuales es una referencia a un Catobjeto. Cada una de las referencias apunta a la dirección de memoria donde se almacena el objeto correspondiente.

  2. Los elementos de la matriz se organizan en un solo bloque en la memoria. Esto se hace para permitir que se acceda a ellos de forma rápida y eficiente.
Por lo tanto, catshace referencia al bloque de memoria donde se almacenan todos los objetos (elementos del arreglo). Cats[0]hace referencia a una dirección específica dentro de este bloque. Algo sobre arreglos - 3 Es importante comprender que una matriz no solo almacena objetos: es un objeto en sí mismo. Esto nos lleva a preguntarnos si podemos crear no solo una matriz de cadenas o números, sino también matrices de matrices . Y la respuesta es sí, ¡podemos! Una matriz puede almacenar cualquier objeto, incluidas otras matrices. Tal matriz se llama bidimensional . Si tuviéramos que representarlo visualmente, sería muy similar a una mesa ordinaria. Supongamos que queremos crear una matriz de 3 matrices que puedan almacenar 10 ints cada una. Se vería así:
Algo sobre arreglos - 4
Cada línea representa una intmatriz. La primera matriz contiene números del 1 al 10, la segunda matriz, del -1 al -10, y la tercera, un conjunto de números aleatorios. Cada una de estas matrices se almacena en las cajas de nuestra matriz bidimensional. En código, la inicialización de una matriz bidimensional se ve así:

public static void main(String[] args) {
   Cat[][] cats = new Cat[3][5];
}
Nuestros gatos de matrices bidimensionales almacenan 3 matrices con 5 cajas en cada matriz. Si queremos poner un objeto en el tercer cuadro de la segunda matriz, haríamos esto:

public static void main(String[] args) {
   Cat[][] cats = new Cat[3][5];
   cats[1][2] = new Cat("Fluffy");
}
[1]indica la segunda matriz e [2]indica el tercer cuadro de esa matriz. Debido a que una matriz bidimensional consta de varias matrices, para iterar a través de ella y mostrar todos sus valores (o completar todos sus elementos), necesitamos un bucle anidado:

for (int i = 0; i < cats.length; i++) {
   for (int j = 0; j < cats[i].length; j++) {
       System.out.println(cats[i][j]);
   }
}
En el ciclo externo (variable i), iteramos sobre todos los arreglos en nuestro arreglo bidimensional. En el ciclo interno (variable j), pasamos por todos los elementos de cada matriz. Como resultado, cats[0][0] (primer arreglo, primer elemento) se mostrará primero, seguido de cats[0][1] (primer arreglo, segundo elemento). Después de pasar por la primera matriz, mostraremos cats[1][0] , cats[1][1] , cats[1][2] , etc. Por cierto, las matrices bidimensionales también son compatibles inicialización abreviada:

int[][] numbers = {{1,2,3}, {4,5,6}, {7,8,9}};
Normalmente, declararíamos la matriz bidimensional numberscomo un int[3][3], pero esta abreviatura nos permite especificar los valores inmediatamente. ¿Por qué necesitarías una matriz bidimensional? Bueno, podría usar uno para recrear fácilmente el famoso juego "Battleship": Algo sobre arreglos - 5 En "Battleship", la estructura del campo de juego se puede describir fácilmente: una matriz bidimensional de 10 matrices con 10 elementos cada una. Creas dos de estas matrices (una para ti y otra para tu oponente)

int[][] battleshipBoard1 = new int[10][10];
int[][] battleshipBoard2 = new int[10][10];
use algunos valores (por ejemplo, números o símbolos) para completar los elementos correspondientes a la ubicación de sus barcos, y luego tomen turnos para decir las coordenadas de elementos específicos:
  • acorazadoTablero1[0][2]!
  • ¡Extrañar! acorazadoTablero2[2][4]!
  • ¡Golpear!
  • acorazadoTablero2[2][5]!
  • ¡Golpear!
  • acorazadoTablero2[2][6]!,
  • hundido!
Esto concluye nuestra primera introducción a las matrices, pero es solo el comienzo de nuestra interacción con ellas. En las siguientes lecciones, veremos formas interesantes en que se pueden usar, y también aprenderemos qué funciones integradas tiene Java para permitirnos trabajar con esta estructura de datos de manera más conveniente :)
Comentarios
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION