JavaRush /Blog Java /Random-ES /Algo sobre matrices en Java

Algo sobre matrices en Java

Publicado en el grupo Random-ES
¡Hola! Anteriormente, durante el entrenamiento, trabajábamos con objetos individuales (o tipos primitivos). Pero, ¿qué pasa si necesitamos trabajar no con un objeto, sino con todo un grupo? Por ejemplo, queremos crear una lista de cumpleaños de todos los empleados de nuestra empresa. Debe contener, digamos, 30 líneas en el formato: "Andrey Petrov, 25 de enero". Una estructura de datos especial, una matriz, nos ayudará aquí. Si se compara el conjunto con objetos de la vida real, su estructura es muy similar a la bóveda de un banco con celdas: Algo sobre matrices en Java - 1el conjunto también consta de celdas. Puedes poner algo en cada celda. En este caso, para acceder al contenido es necesario saber el número de celular. La matriz se crea así:
public class Main {

   public static void main(String[] args) {

       String [] birthdays = new String[10]; // matriz de cadenas Java

   }
}
Aquí hemos creado una matriz de 10 celdas. Puede prestar atención inmediatamente a algunas características de la matriz:
  1. Almacena datos de un tipo estrictamente definido. Si inicialmente creamos una matriz de cadenas String, no podremos almacenar nada más en ella. El tipo de datos se especifica al crear la matriz. Esto es lo que la distingue de una caja de seguridad, en la que el cliente puede guardar lo que quiera.
  2. Una matriz puede almacenar datos de tipos primitivos (por ejemplo, int), cadenas ( String) u objetos de la misma clase. Más precisamente, ni siquiera los objetos en sí, sino enlaces a estos objetos.
  3. El tamaño de la matriz debe especificarse durante la creación. No podrá especificarlo más adelante ni cambiar su tamaño después de su creación.
Java indica que se está creando una matriz utilizando corchetes []en ambos lados de la expresión. Se pueden especificar antes o después del nombre de la variable de referencia; funcionará de cualquier manera:
//Matrices Java de cadenas, dos sintaxis
String [] birthdays = new String[10];
String birthdays [] = new String[10];
Si desea escribir algo en una matriz, debe especificar el número de celda en la que se escribirá el valor. Los números de celda de la matriz comienzan en 0. Comenzar desde cero es una práctica común en programación. Cuanto más rápido te acostumbres, mejor :) Algo sobre matrices en Java - 2Es decir, si quieres poner algún valor en la primera celda del array , se hace así:
public class Main {

   public static void main(String[] args) {

       String birthdays [] = new String[10];
       birthdays[0] = "Lena Eliseeva, 12 de marzo";
   }
}
Ahora la primera celda de nuestra matriz, que contiene los cumpleaños de los colegas, contiene una cadena con el cumpleaños de Lena. Por analogía, puedes agregar otros valores:
public class Main {

   public static void main(String[] args) {

       String birthdays [] = new String[10];
       birthdays[0] = "Lena Eliseeva, 12 de marzo";
       birthdays[1] = "Kolya Romanov, 18 de mayo";
       birthdays[7] = "Olesya Ostapenko, 3 de enero";
   }
}
Tenga en cuenta: agregamos el cumpleaños de Olesya a la octava celda (¿ha olvidado por qué la celda número 7 es la octava?). Aunque todas las demás celdas no están completadas. No es necesario escribir los valores en la matriz en orden; no existe tal restricción. Por otro lado, si escribe en orden, será mucho más fácil realizar un seguimiento del número de celdas libres y ocupadas, y no quedarán “huecos” en la matriz. Si desea obtener el contenido de una celda de matriz, como en el caso de una celda de banco, necesita saber su número. Esto se hace así:
public class Main {

   public static void main(String[] args) {

       String birthdays [] = new String[10];
       birthdays[0] = "Lena Eliseeva, 12 de marzo";
       birthdays[1] = "Kolya Romanov, 18 de mayo";
       birthdays[7] = "Olesya Ostapenko, 3 de enero";

       String olesyaBirthday = birthdays[7];
       System.out.println(olesyaBirthday);
   }
}
Salida de consola:

Олеся Остапенко, 3 января
Creamos una variable Stringy le dijimos al compilador: "Busque la celda con índice 7 en la matriz birthdaysy asigne el valor almacenado allí a la variable String olesyaBirthday". Eso es exactamente lo que hizo.

Longitud de la matriz Java

Cuando trabaja con una matriz, puede averiguar fácilmente su longitud utilizando una propiedad especial: length.
public class Main {

   public static void main(String[] args) {

       String birthdays [] = new String[10];
       birthdays[0] = "Lena Eliseeva, 12 de marzo";
       birthdays[1] = "Kolya Romanov, 18 de mayo";
       birthdays[7] = "Olesya Ostapenko, 3 de enero";

       int birthdaysLength = birthdays.length;
       System.out.println(birthdaysLength);
   }
}
Salida de consola:

10
Nota:La propiedad lengthalmacena el tamaño de la matriz, no el número de celdas llenas. Nuestra matriz solo almacena 3 valores, pero cuando la creamos, le especificamos tamaño = 10. Este es el valor que devuelve el campo length. ¿Por qué podría ser útil esto? Bueno, por ejemplo, si quieres imprimir una lista de todos los cumpleaños en la consola (para comprobar que no se ha olvidado a nadie), puedes hacerlo en un bucle simple:
public class Main {

   public static void main(String[] args) {

       String birthdays [] = new String[10];
       birthdays[0] = "Lena Eliseeva, 12 de marzo";
       birthdays[1] = "Kolya Romanov, 18 de mayo";
       birthdays[2] = "Vika Ignatova, 12 de julio";
       birthdays[3] = "Denis Kozlov, 7 de septiembre";
       birthdays[4] = "Maxim Maslennikov, 9 de noviembre";
       birthdays[5] = "Roman Baranov, 14 de agosto";
       birthdays[6] = "Valéry Pyatkina, 1 de abril";
       birthdays[7] = "Olesya Ostapenko, 3 de enero";
       birthdays[8] = "Kostya Gurko, 19 de octubre";
       birthdays[9] = "Seryozha Naumov, 3 de mayo";

       for (int i = 0; i < birthdays.length; i++) {
           System.out.println(birthdays[i]);
       }
   }
}
En el bucle creamos una variable ique inicialmente es igual a cero. En cada pasada, tomamos la celda con índice i de nuestra matriz e imprimimos su valor en la consola. El bucle realizará 10 iteraciones y los valores de i aumentarán de 0 a 9, ¡solo de acuerdo con los índices de las celdas de nuestra matriz! De esta manera imprimiremos todos los valores de birthdays[0]a a la consola birthdays[9] , de hecho, hay formas de crear una matriz de manera diferente. Por ejemplo, intse puede crear una matriz de números así:
public class Main {

   public static void main(String[] args) {
       int numbers [] = {7, 12, 8, 4, 33, 79, 1, 16, 2};
   }
}
Este método se llama "inicialización rápida". Es bastante conveniente porque inmediatamente creamos una matriz y la llenamos con valores. No es necesario especificar explícitamente el tamaño de la matriz: el campo lengthse completará automáticamente durante la inicialización rápida.
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 consola:

9

Matriz de objetos Java

Ya has oído que los conjuntos de objetos y los conjuntos de primitivos se almacenan en la memoria de forma diferente. Tomemos, por ejemplo, una matriz de tres objetos Cat:
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("Tomás");
       cats[1] = new Cat("Hipopótamo");
       cats[2] = new Cat("Felipe Markovich");
   }
}
Hay algunas cosas que entender aquí:
  1. En el caso de las primitivas, las matrices de Java almacenan muchos valores específicos (como números int). En el caso de los objetos, una matriz almacena muchas referencias. La matriz catsconsta de tres celdas, cada una de las cuales contiene una referencia a un objeto Cat. Cada uno de los enlaces apunta a una dirección en la memoria donde se almacena ese objeto.
  2. Los elementos de la matriz se almacenan en la memoria en un solo bloque. Esto se hace para un acceso más eficiente y rápido a ellos. Por tanto, el enlace catsapunta a un bloque en la memoria donde se almacenan todos los objetos (los elementos de la matriz). A cats[0]- a una dirección específica dentro de este bloque.
Algo sobre matrices en Java - 3Es importante comprender que una matriz no sólo puede almacenar objetos, sino que es en sí misma un objeto.

Matriz de matrices o matriz bidimensional

En base a esto, nos enfrentamos a la pregunta: ¿podemos crear, por ejemplo, no una matriz de cadenas o números, sino una matriz de matrices? Y la respuesta será: ¡sí, podemos! Una matriz puede almacenar cualquier objeto dentro de ella, incluidas otras matrices. Una matriz de este tipo se denominará bidimensional. Si lo representas en una imagen, se verá muy similar a una mesa normal. Por ejemplo, queremos crear una matriz que almacene 3 matrices de números intcon 10 celdas cada una. Se verá así: Algo sobre matrices en Java - 4Cada línea representa una serie de números int. La primera matriz contiene números del 1 al 10, la segunda, del -1 al -10, la tercera, un conjunto de números aleatorios. Cada una de estas matrices se almacena en una celda de nuestra matriz bidimensional. La inicialización de una matriz bidimensional en código se ve así:
public static void main(String[] args) {
   Cat[][] cats = new Cat[3][5];
}
Nuestra matriz de gatos bidimensional almacena 3 matrices de 5 celdas cada una. Si queremos poner nuestro objeto en la tercera celda del segundo array, lo hacemos así:
public static void main(String[] args) {
   Cat[][] cats = new Cat[3][5];
   cats[1][2] = new Cat("Pelusa");
}
[1]apunta a la segunda matriz y [2]apunta a la tercera celda de esta matriz. Dado que una matriz bidimensional consta de varias matrices, para recorrerla e imprimir todos los valores en la consola (o llenar todas las celdas), necesitamos un bucle doble 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 bucle exterior (variable i), nos turnamos para recorrer todas las matrices que componen nuestra matriz bidimensional. En el bucle interno (variable j) iteramos por todas las celdas de cada matriz. Como resultado, el objeto cats[0][0](primera matriz, primera celda) se mostrará primero en la consola y el segundo objeto cats[0][1](primera matriz, segunda celda). Cuando se agote la primera matriz, se generará , cats[1][0], cats[1][1]etc. cats[1][2]Por cierto, la inicialización rápida también está disponible para matrices bidimensionales:
int[][] numbers = {{1,2,3}, {4,5,6}, {7,8,9}};
Normalmente, escribiríamos una matriz bidimensional numberscomo int[3][3], pero este método nos permite especificar los valores inmediatamente. ¿Por qué podría ser necesaria una matriz bidimensional? Bueno, por ejemplo, con su ayuda puedes recrear fácilmente el famoso juego "Battleship": Algo sobre matrices en Java - 5la estructura del campo de juego en "Battleship" es tal que se puede describir fácilmente: una matriz bidimensional de 10 matrices, 10 celdas cada una. . Creas dos de estos arreglos, para ti y tu oponente:
int [][] seaBattle = new int[10][10];
int [][] seaBattle2 = new int[10][10];
Completas con algunos valores (por ejemplo, números o signos *) las celdas en las que se encuentran tus barcos, y luego tú y tu oponente os turnáis para llamar a los números de celda:
  • batalla marítima[6][5]!
  • ¡Pasado! seaBattle2[6][6]!
  • ¡Herido!
  • seaBattle2[6][7]!
  • ¡Herido!
  • seaBattle2[6][8]!,
  • ¡Delicado!

Recursos adicionales sobre matrices

¿Quieres saber más sobre las matrices? Por favor, eche un vistazo a los artículos a continuación. Hay mucha información interesante y útil sobre este tema.
  1. Arreglos en Java : un artículo detallado sobre arreglos, su creación, inicialización y uso. Con ejemplos.
  2. La clase Arrays y su uso : el artículo describe algunos métodos de la claseArray
  3. Arrays es la primera conferencia de JavaRush dedicada a los arrays.
  4. Arreglos multidimensionales : un artículo detallado sobre arreglos multidimensionales con ejemplos.
  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.
Con esto concluye nuestro primer conocimiento de las matrices, pero esto es solo el comienzo de la interacción con ellas. En las siguientes conferencias veremos formas interesantes de usarlos y también descubriremos qué funciones integradas tiene Java para trabajar más cómodamente con esta estructura de datos :)
Comentarios
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION