Saltar al contenido principal

Arrays y cadenas

Hasta ahora hemos trabajado con variables capaces de almacenar un único valor.

Por ejemplo:

int edad = 25;
double precio = 19.99;
String nombre = "María";

Pero en muchos programas necesitamos trabajar con varios valores relacionados entre sí.

Por ejemplo:

  • Las notas de varios alumnos.
  • Las edades de un grupo de personas.
  • Los precios de varios productos.
  • Los nombres de una lista.
  • Los números de una serie.

Podríamos crear una variable para cada valor:

int nota1 = 7;
int nota2 = 8;
int nota3 = 6;
int nota4 = 9;

Pero esto rápidamente se vuelve incómodo.

Para solucionar este problema podemos utilizar los arrays.

Un array permite almacenar varios valores del mismo tipo dentro de una única estructura.

Además, los arrays están muy relacionados con los bucles, ya que podemos recorrer sus elementos utilizando for, while o for-each.


Arrays

Un array es una estructura que permite almacenar varios valores del mismo tipo. Podemos pensar en él como un listado de valores.

Por ejemplo, podemos crear un array para almacenar cinco notas:

int[] notas = {7, 8, 6, 9, 10};

En este caso tenemos una única variable llamada notas, pero dentro de ella hay cinco valores.

Podemos imaginar el array de esta forma:

ÍndiceValor
07
18
26
39
410

Cada posición del array tiene un índice.

Es muy importante recordar que los índices empiezan en 0.

Por lo tanto:

  • El primer elemento está en la posición 0.
  • El segundo elemento está en la posición 1.
  • El tercero está en la posición 2.
  • Y así sucesivamente.

Crear un array

Lo esencial al crear un array es que debemos definir su tipo, es decir, el tipo de variable que almacenará. La sintaxis base será tipo[] variable.

Hay dos maneras de crear arrays:

  • Indicando directamente sus valores:
int[] numeros = {10, 20, 30, 40, 50};
  • Indicando únicamente su tamaño, sin añadirle ningún valor en concreto:
int[] numeros = new int[5];

En este caso hemos creado un array capaz de almacenar cinco números enteros.

Inicialmente, los valores serán 0:

[0, 0, 0, 0, 0]

Después podemos asignar valores a sus posiciones usando su índice:

numeros[0] = 10;
numeros[1] = 20;
numeros[2] = 30;
numeros[3] = 40;
numeros[4] = 50;

El resultado sería:

[10, 20, 30, 40, 50]

Acceder a los elementos

Para acceder a un elemento utilizamos su índice.

Por ejemplo, para acceder al primer elemento del array (posición 0):

int[] numeros = {10, 20, 30, 40, 50};

System.out.println(numeros[0]);

Salida:

10

También podemos acceder a cualquier otra posición:

System.out.println(numeros[3]);

Salida:

40

Modificar elementos

Los elementos de un array también pueden modificarse. Al igual que antes, se hace usando el índice/posición que ocupa el elemento que queremos modificar en el array.

Imaginemos que dado un array queremos cambiar el tercer elemento:

int[] numeros = {10, 20, 30, 40, 50};

numeros[2] = 100;

Ahora el array sería:

[10, 20, 100, 40, 50]

El valor que estaba en la posición 2 ha sido sustituido.


La propiedad length

Los arrays tienen una propiedad llamada length que indica cuántos elementos contiene el array.

int[] numeros = {10, 20, 30, 40, 50};

System.out.println(numeros.length);

Salida:

5

Esto resulta especialmente útil cuando queremos recorrer un array.

Recorrer un array con for

Una de las situaciones más habituales al trabajar con arrays es recorrer todos sus elementos.

Podemos utilizar un bucle for combinándolo con la propiedad length:

int[] numeros = {10, 20, 30, 40, 50};

for (int i = 0; i < numeros.length; i++) {

System.out.println(numeros[i]);

}

Vemos que sigue la misma estructura que un bucle for normal:

La variable i representa el índice del elemento que estamos recorriendo.

En cada repetición:

i = 0 → numeros[0]
i = 1 → numeros[1]
i = 2 → numeros[2]
i = 3 → numeros[3]
i = 4 → numeros[4]

Cuando i llega a 5, la condición:

i < numeros.length

deja de cumplirse y el bucle termina.


Arrays multidimensionales

Hasta ahora hemos trabajado con arrays de una sola dimensión, es decir, listas de elementos individuales.

Sin embargo, también podemos crear arrays que tengan varias dimensiones, como si fuese una matriz.

Un array de dos dimensiones puede imaginarse como una tabla con filas y columnas.

Por ejemplo:

int[][] numeros = {
{1, 2, 3},
{4, 5, 6},
{7, 8, 9}
};

Podemos imaginarlo así:

Columna 0Columna 1Columna 2
Fila 0123
Fila 1456
Fila 2789

Para acceder a un elemento necesitamos indicar dos índices:

numeros[0][1]

El primer índice indica la fila. El segundo indica la columna. Por lo tanto:

System.out.println(numeros[0][1]);

Salida:

2

Recorrer un array multidimensional

Para recorrer un array de dos dimensiones podemos utilizar dos bucles for.

El primer bucle se encargará de las filas y siguiente de las columnas.

int[][] numeros = {
{1, 2, 3},
{4, 5, 6},
{7, 8, 9}
};

for (int fila = 0; fila < numeros.length; fila++) {

for (int columna = 0; columna < numeros[fila].length; columna++) {

System.out.println(numeros[fila][columna]);

}

}

El primer for recorre las filas.

El segundo for recorre las columnas de cada fila.

A primera vista puede parecer muy complicado, pero hemos de tener en cuenta que siempre será exactamente igual. Vamos a detallarlo para que quede más claro:

for (int fila = 0; fila < numeros.length; fila++) {

En este primer bucle tenemos el contador fila, que empieza en 0 (primera fila de la matriz).

Por tanto la variable fila equivaldrá en nuestro ejemplo a cada una de las filas enteras:

Primero: fila =   {1, 2, 3}
Segundo: fila = {4, 5, 6}
Tercero: fila = {7, 8, 9}

Como nuestro objetivo es acceder a los números de la matriz uno por uno no podemos dejarlo en un solo for. Así que una vez accedemos a la fila, antes de pasar a la siguiente fila, recorreremos dicha fila para acceder elemento a elemento. Para ello el segundo bucle dentro del primero:

for (int fila = 0; fila < numeros.length; fila++) {

for (int columna = 0; columna < numeros[fila].length; columna++) {

Aquí la variable columna vemos que empieza en la posición 0 y termina en la última posición de la fila (si nos fijamos es columna < numeros[fila] en lugar de columna < numeros).

De manera que con este bucle las variables filay columna evolucionan así:

1: fila = 0
1.1: fila = 0 y columna = 0: 1
1.2: fila = 0 y columna = 1: 2
1.3: fila = 0 y columna = 2: 3

2: fila = 1
2.1: fila = 1 y columna = 0: 4
2.2: fila = 1 y columna = 1: 5
2.3: fila = 1 y columna = 2: 6

3: fila = 1
3.1: fila = 2 y columna = 0: 7
3.2: fila = 2 y columna = 1: 8
3.3: fila = 2 y columna = 2: 9

Observa que el valor de la fila se incrementa hasta que no se ha recorrido todas las columnas de dicha fila.

Ejemplo: notas de alumnos

Podemos utilizar un array multidimensional para almacenar las notas de varios alumnos.

double[][] notas = {
{7.5, 8.0, 6.5},
{9.0, 8.5, 7.0},
{6.0, 7.5, 8.0}
};

Cada fila puede representar a un alumno y cada columna una asignatura.

Podemos recorrer todas las notas:

for (int alumno = 0; alumno < notas.length; alumno++) {

for (int asignatura = 0; asignatura < notas[alumno].length; asignatura++) {

System.out.println(notas[alumno][asignatura]);

}

}

Cadenas de texto: String

Hasta ahora hemos utilizado String para almacenar textos.

Por ejemplo:

String nombre = "María";

Un String es una cadena de caracteres.

Por ejemplo:

String texto = "Hola mundo";

Podemos imaginar que una cadena está formada por diferentes caracteres:

H o l a   m u n d o

Al igual que ocurre con los arrays, los caracteres tienen posiciones que empiezan en 0.

Índice:   0 1 2 3 4
Carácter: H o l a !

String y arrays de caracteres

Al igual que ocurre con los arrays, los mismos for sirven para recorrer los caracteres de un texto.

Por ejemplo:

String palabra = "Java";

for (int i = 0; i < palabra.length(); i++) {

System.out.println(palabra.charAt(i));

}

Salida:

J
a
v
a

Aquí estamos utilizando un bucle for junto con dos métodos de String:

palabra.length()

para conocer cuántos caracteres tiene la cadena y:

palabra.charAt(i)

para obtener cada carácter.

:warning ATENCION porque es el mismo bucle para Strings que para arrays, pero teniendo en cuenta que en String se llama texto.length() y en arrays es listado.length, sin paréntesis al final.


for-each

Cuando trabajamos con arrays, es habitual usar el for típico que hemos visto usando el índice. Sin embargo existe una manera de recorrer todos sus elementos sin necesidad de utilizar el índice.

Para estos casos podemos utilizar el bucle for-each.

Su sintaxis es:

for (tipo elemento : array) {

// Código

}

Por ejemplo:

int[] numeros = {10, 20, 30, 40, 50};

for (int numero : numeros) {

System.out.println(numero);

}

Salida:

10
20
30
40
50

En cada repetición, la variable numero contiene uno de los elementos del array, sin necesidad de utilizar en índice.

A la larga es una manera más cómoda de trabajar cuando no vas a usar el índice para nada más, ya que la variable iteradora equivale directamente al elemento sin necesidad de hacer elemento = listado[indice].


Diferencia entre for y for-each

Podemos recorrer el mismo array utilizando un for tradicional:

int[] numeros = {10, 20, 30, 40, 50};

for (int i = 0; i < numeros.length; i++) {

System.out.println(numeros[i]);

}

O utilizando for-each:

for (int numero : numeros) {

System.out.println(numero);

}

El for-each es más sencillo cuando solo necesitamos acceder a los valores.

El for tradicional es más adecuado cuando necesitamos conocer o modificar los índices.


Errores frecuentes

Confundir el índice con la posición real

Recuerda que los arrays empiezan en 0.

int[] numeros = {10, 20, 30};

Las posiciones son:

0 → 10
1 → 20
2 → 30

Por lo tanto:

System.out.println(numeros[3]);

producirá un error porque esa posición no existe.


Utilizar length incorrectamente

En un array utilizamos:

numeros.length

Sin paréntesis.

En un String utilizamos:

texto.length()

Con paréntesis.

Por ejemplo:

int[] numeros = {1, 2, 3};

System.out.println(numeros.length);

Mientras que:

String texto = "Hola";

System.out.println(texto.length());

Recorrer un array hasta length

Incorrecto:

for (int i = 0; i <= numeros.length; i++) {

System.out.println(numeros[i]);

}

La condición correcta es:

for (int i = 0; i < numeros.length; i++) {

System.out.println(numeros[i]);

}

La diferencia está en el < en lugar de <=.

Comparar String con ==

Aunque esto funciona:

if (nombre == "María") {

System.out.println("Hola");

}

Es preferible utilizar:

if (nombre.equals("María")) {

System.out.println("Hola");

}

Ejemplos resueltos

Ejercicio resuelto 1 - Calcular la media de un array

Enunciado

Tenemos las siguientes notas:

7, 8, 6, 9, 10

Crea un programa que calcule la media de todas las notas.

Análisis

Tenemos varios valores relacionados, por lo que podemos almacenarlos en un array.

Después debemos recorrer todos sus elementos y acumular su valor.

Finalmente dividimos la suma entre el número de elementos.

Solución

int[] notas = {7, 8, 6, 9, 10};

int suma = 0;

for (int nota : notas) {

suma += nota;

}

double media = (double) suma / notas.length;

System.out.println("Media: " + media);

Explicación

El for-each recorre todas las notas.

En cada repetición añadimos la nota a suma.

Después dividimos la suma entre el número de elementos del array utilizando notas.length.


Ejercicio resuelto 2 - Buscar un nombre

Enunciado

Tenemos un array con varios nombres.

Comprueba si el nombre "María" aparece en el array.

Análisis

Debemos recorrer todos los nombres y comparar cada uno de ellos con "María".

Para comparar String utilizaremos equals().

Solución

String[] nombres = {"Ana", "Luis", "Carlos", "María", "Laura"};

boolean encontrado = false;

for (String nombre : nombres) {

if (nombre.equals("María")) {

encontrado = true;

}

}

if (encontrado) {

System.out.println("María está en la lista.");

} else {

System.out.println("María no está en la lista.");

}

Explicación

Recorremos todos los nombres utilizando for-each.

Cada nombre se compara con "María".

Si encontramos una coincidencia, cambiamos encontrado a true.

Al terminar el recorrido mostramos el resultado.


Ejercicio resuelto 3 - Recorrer una matriz

Enunciado

Tenemos una matriz de números.

Muestra todos sus elementos.

Análisis

Como tenemos filas y columnas, necesitamos dos bucles.

El primer bucle recorrerá las filas.

El segundo recorrerá las columnas.

Solución

int[][] numeros = {
{1, 2, 3},
{4, 5, 6},
{7, 8, 9}
};

for (int fila = 0; fila < numeros.length; fila++) {

for (int columna = 0; columna < numeros[fila].length; columna++) {

System.out.print(numeros[fila][columna] + " ");

}

System.out.println();

}

Salida:

1 2 3
4 5 6
7 8 9

Explicación

El primer for recorre las filas de la matriz.

El segundo for recorre los elementos de cada fila.

Al terminar cada fila utilizamos:

System.out.println();

para pasar a la siguiente línea.