¡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: el 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:
- 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. - 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. - 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.
[]
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 :) Es 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 String
y le dijimos al compilador: "Busque la celda con índice 7 en la matriz birthdays
y 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 length
almacena 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 i
que 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, int
se 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 length
se 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 objetosCat
:
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í:
- 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 matrizcats
consta de tres celdas, cada una de las cuales contiene una referencia a un objetoCat
. Cada uno de los enlaces apunta a una dirección en la memoria donde se almacena ese objeto. - 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
cats
apunta a un bloque en la memoria donde se almacenan todos los objetos (los elementos de la matriz). Acats[0]
- a una dirección específica dentro de este bloque.
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úmerosint
con 10 celdas cada una. Se verá así: Cada 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 numbers
como 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": la 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.- Arreglos en Java : un artículo detallado sobre arreglos, su creación, inicialización y uso. Con ejemplos.
- La clase Arrays y su uso : el artículo describe algunos métodos de la clase
Array
- Arrays es la primera conferencia de JavaRush dedicada a los arrays.
- Arreglos multidimensionales : un artículo detallado sobre arreglos multidimensionales con ejemplos.
- 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.
GO TO FULL VERSION