Java Tema 3
Arrays
1. Arrays Unidimensionales (Vectores)#
Un array (también llamado vector) es una estructura de datos que nos permite almacenar un conjunto de elementos del mismo tipo en posiciones de memoria contiguas. Puedes verlo como una lista de variables por ahora. Piénsalo como un mueble con un número fijo de cajones:
- El mueble es el array.
- Cada cajón es una posición (hueco).
- Lo que guardas en cada cajón es el dato.
Importante
En Java, los arrays solo pueden guardar datos de un mismo tipo y con una cantidad fija (es decir, si decimos que serán 10 Strings, ni podremos meter luego un int, ni podremos meter 11 Strings).
Crear array sin valores#
Para usar un array, debemos seguir dos pasos: declararlo y luego inicializarlo (darle un nombre e indicarle el tamaño)
// Creamos (declaramos) el array e indicamos cuántos huecos tendrá (inicializamos)
int[] notas = new int[10]; // Un array para 10 notas de tipo intCrear array con valores#
Si ya sabes qué valores va a contener, podemos indicarlos directamente al crearlo:
// Java crea automáticamente un array de tamaño 5
String[] diasSemana = {"Lunes", "Martes", "Miércoles", "Jueves", "Viernes"}; Acceso y Modificación (Índices)#
Accedemos a cada "cajón" (elemento) usando su índice, que se escribe entre corchetes [].
Importante
Los índices en Java (y en la mayoría de lenguajes) empiezan siempre en 0.
Si un array tiene 5 elementos, sus índices van del 0 al 4. Por ejemplo, con int[] notas = {7, 4, 9, 6, 8};:
| Índice | 0 | 1 | 2 | 3 | 4 |
|---|---|---|---|---|---|
| Valor | 7 | 4 | 9 | 6 | 8 |
notas[0]es el primer elemento (vale 7).notas[4]es el último elemento (vale 8).notas[5]no existe: el programa se para con un errorArrayIndexOutOfBoundsException.
Con esto, podemos hacer dos cosas:
- Consultar y mostrar un elemento:
System.out.println( notas[3] ); - Guardar o cambiar valores:
notas[2] = 7;
Para saber el tamaño de un array, podemos usar la propiedad .length (sin paréntesis).
Recorriendo un array (Bucle for)#
La forma más común y eficiente de "visitar" cada elemento de un array es usando un bucle for. Combinamos el bucle con la propiedad .length para que se repita la cantidad exacta de veces (tantas como elementos tenga el array).
for (int i = 0; i < notas.length; i++) {
System.out.print(notas[i]); //Imprime la nota[0], después la nota[1]...
}Recorriendo un array (Bucle for-each)#
Existe una variante más moderna y legible del bucle for, conocida como for-each (o "bucle mejorado"). Esta estructura está diseñada específicamente para recorrer todos los elementos de un array, desde el primero hasta el último, sin necesidad de manejar contadores ni índices manualmente.
double[] notas = {4.5, 8.0, 6.5, 9.0};
for (double nota : notas) {
// La variable 'nota' va tomando el valor de cada posición
System.out.print(nota + " ");
}¿Cuándo usar un bucle u otro?#
| Necesito… | for | for-each |
|---|---|---|
| Saber la posición del elemento ("La nota del alumno 1 es...") | Sí | No |
Modificar el contenido del array (notas[i] = 5;) | Sí | No |
| Recorrer solo una parte (por ejemplo, la mitad, o al revés) | Sí | No |
| Leer todos los datos uno por uno, con un código más limpio | Sí | Sí, y sin riesgo de salirse del array |
¡Ojo! En un bucle for-each, la variable temporal (ej. nota) es una copia del valor. Si modificas nota dentro del bucle, NO se modifica el array original. Para modificar el array, necesitas obligatoriamente el índice (i) del bucle for clásico.
2. Arrays Bidimensionales (Matrices)#
Un array bidimensional es, simplemente, un "array de arrays". Nos sirve para representar datos en una cuadrícula (filas y columnas). Piénsalo como un tablero de ajedrez o una hoja de cálculo.
Declaración e Inicialización#
Al igual que con los arrays anteriores (unidimensionales) podemos crearlos sin datos (vacíos) o ya con los datos rellenos. En ambos casos, usamos dobles corchetes [][] para indicar que es bidimensional.
// Creamos el array vacío, 3 filas y 4 columnas
int[][] tablero = new int[3][4];
// Guardamos un dato (fila 1, columna 2) (Recuerda: índice 0)
tablero[1][2] = 100;// Creamos el array ya con los datos
int[][] tablero = {
{1, 2, 3}, // Fila 0
{4, 5, 6}, // Fila 1
{7, 8, 9} // Fila 2
};Así queda ese tablero en memoria, como una cuadrícula:
| Columna 0 | Columna 1 | Columna 2 | |
|---|---|---|---|
| Fila 0 | 1 | 2 | 3 |
| Fila 1 | 4 | 5 | 6 |
| Fila 2 | 7 | 8 | 9 |
Primero se indica la fila y después la columna: tablero[1][2] vale 6. Además, tablero.length es el número de filas (3) y tablero[0].length, el de columnas (3).
Recorrido de Matrices (Bucles anidados)#
Para recorrer una matriz, necesitamos un bucle for anidado:
- El bucle exterior recorre las filas.
- El bucle interior recorre las columnas de cada fila.
public class EjemploMatriz {
public static void main(String[] args) {
int[][] matriz = {
{1, 2, 3},
{4, 5, 6}
};
for (int i = 0; i < matriz.length; i++) {
for (int j = 0; j < matriz[i].length; j++) {
System.out.print( matriz[i][j] );
}
System.out.println();
}
}
}void main() {
int[][] matriz = {
{1, 2, 3},
{4, 5, 6}
};
for (int i = 0; i < matriz.length; i++) {
for (int j = 0; j < matriz[i].length; j++) {
IO.print( matriz[i][j] );
}
IO.println();
}
}Hagamos algunas observaciones de lo que está haciendo este código:
- Crea una matriz de 2 filas y 3 columnas, ya rellena de números enteros.
- Un bucle principal (el de la
i) recorre las filas. - Un bucle interno (el de la
j) recorre cada elemento de cada fila (es decir, cada columna) y lo imprime (conprint, sinlnpara que se impriman seguidos en la misma linea). - Al terminar cada fila, y antes de pasar a la siguiente, se hace un
printlnvacío solo para saltar de línea.
Errores frecuentes#
| Mensaje o síntoma | Qué significa | Cómo se arregla |
|---|---|---|
ArrayIndexOutOfBoundsException: Index 5 out of bounds for length 5 | Al ejecutar: has usado una posición que no existe. En un array de 5, el último índice es el 4 | En los bucles, usa i < notas.length, no i <= notas.length |
cannot find symbol en notas.length() | En los arrays, length va sin paréntesis | notas.length. (En los String sí lleva: texto.length()) |
Se imprime algo como [I@511d50c0 | Has hecho System.out.println(notas): eso muestra la dirección del array en memoria, no su contenido | Recórrelo con un bucle e imprime cada elemento |
| Cambias la variable del for-each y el array no cambia | En un for-each, la variable es una copia del valor | Usa un for con índice: notas[i] = 5; |