Arrays unidimensionales en Java

Los arrays son una forma de representar el concepto de matriz, que cuando tienen una dimensión se suelen conocer como vectores. Personalmente me gusta más llamarlos vectores, pero en Java ya existe una clase específica que se llama así, Vector, y como el término array está bastante extendido voy a seguir utilizándolo para referirme a esta estructura de datos.

Muchas veces necesitamos almacenar una serie de datos del mismo tipo pero o bien no sabemos cuántos, o son tantos que el trabajo de definir variables para cada uno de ellos sería demasiado pesado. Si estos datos además están relacionados, una manera de gestionarlos sería mediante el uso de un array.

Arrays unidimensionales
Arrays unidimensionales

Declaración de arrays

Imagina que queremos almacenar los días de la semana. Podríamos declarar un array y a la vez inicializarlo con esos valores. Para indicar que una variable va contener un array debemos añadirle unos corchetes. Fíjate en este ejemplo:

// Declaración e inicialización
String diasSemana[] = {"lunes", "martes", "miércoles", "jueves", "viernes", "sábado", "domingo"};
String rgb[] = {"rojo", "verde", "azul"};

Declarar e inicializar un array unidimensional

Fíjate cómo para indicar los valores en la asignación, empezamos con unas llaves y separamos cada elemento mediante una coma. Cuando terminamos cerramos la llave y ponemos punto y coma.

int diasSemanaNumericos[] = {1, 2, 3, 4, 5, 6, 7};

Una vez definido un array el tamaño del mismo permanece invariable a no ser que lo reasignemos, y por consiguiente perdamos todo lo que teníamos almacenado.

// Queda definido un tamaño de 7 posiciones
int edades[] = {13, 20, 31, 24, 15, 16, 27}; 
// Se pierden los datos anteriores para guardar los nuevos
edades = new int[]{1, 2};

Te habrás fijado en que para definir de nuevo el array se usa la palabra reservada new. Es fácil deducir que se crea uno nuevo, por lo tanto se pierde todo lo que hubiera almacenado anteriormente.

// Se declara un array sin tamaño
int edades[];
// Ahora lo inicializamos con 7 valores
edades = new int[] {13, 20, 31, 24, 15, 16, 27}; 

Declaración múltiple de arrays

Podemos declarar varios arrays en la misma línea si seguimos unas pautas:

int[] v1, v2, v3; // Declaramos 3 vectores unidimensionales
String s1[], s2[], s3; Declaramos 2 vectores y un String normal --> s3

Si optas por poner los corchetes junto al tipo de dato, todas las variables que definas en esa misma línea estarán declaradas como arrays. Sin embargo, si decides incluir los corchetes al lado del nombre de la variable, tienes que hacerlo para cada variable que quieres que actúe como un array.

Por cierto, supongo que lo habrás deducido pero, por si acaso, debes saber que para declarar el tamaño de un array puedes utilizar una variable, incluso si el valor de esa variable se ha introducido por el usuario.

// Ejemplo de definición del tamaño de un array en tiempo de ejecución

int longitud=5;
// Definir tamaño a partir de una variable
String nombres[] = new String[longitud];
// Ahora definimos un array obteniendo el tamaño del usuario
Scanner sc = new Scanner(System.in);
System.out.println("Introduzca el número de notas:");
longitud = sc.nextInt();
int notas[] = new int[longitud];

Acceso a los datos

Los datos de un array son accesibles uno a uno. Para hacerlo debemos indicar entre corchetes la posición del array a la que queremos acceder, siempre recordando que las posiciones de los arrays comienzan en la posición 0.

String diasSemana[] = {"lunes", "martes", "miércoles", "jueves", "viernes", "sábado", "domingo"};
System.out.println(diasSemana[0]); // lunes.

También podemos asignar valores siguiendo el mismo método de poner la posición entre corchetes. Mira cómo declaramos un array sin definir sus valores para luego rellenarlo.

// Se declara un array vacío con espacio para 3 enteros
int edades[] = new int[3];
// Ahora inicializamos individualmente cada una de sus posiciones
edades[0] = 32; // Recuerda que se empieza en 0
edades[1] = 15;
edades[2] = 27; // Hemos rellenado 3 posiciones
// Si tratamos de asignar valor a la posición 3 nos daría un error

Si en un momento dado necesitas saber el número de elementos que tiene un array unidimensional haz uso de su propiedad length.

String diasSemana[] = new String[7];
diasSemana[0] = "lunes";
System.out.println(diasSemana.length); // Escribe un 7

Recorrido de un array unidimensional

Recorrer un array consiste en aplicar una acción a cada elemento de dicho array, uno por uno, por ejemplo asignar un valor, escribirlo o hacer algún tipo de operación con él. Para recorrer un array lo más usual es usar un bucle for:

Scanner sc = new Scanner(System.in);
System.out.println("Introduzca el número de notas:");
int notas[] = new int[sc.nextInt()];

// Recorremos el vector rellenándolo
System.out.println("Introduzca las notas: ");
for (int i = 0; i < notas.length; i++) {
    notas[i] = sc.nextInt();
}

// Recorremos para escribir
for (int i = 0; i < notas.length; i++) {
    System.out.print(notas[i] + " ");
}
System.out.println("");

int suma=0;
// Recorremos para hacer cálculos
for (int i = 0; i < notas.length; i++) {
    suma += notas[i];
}
System.out.println(suma);

Observa como inicializamos el valor de i en el bucle for a 0, y ponemos el límite en la longitud del array (notas.length).

Para escribir fácilmente cualquier array podemos usar la clase Arrays que permite convertir un array a String, entre otras muchas cosas que ya veremos.

String diasSemana[] = {"lunes", "martes", "miércoles", "jueves", "viernes", "sábado", "domingo"};
System.out.println(Arrays.toString(diasSemana));

Recorrido con bucle for-each

En Java existe un bucle tipo for-each, aunque su sintaxis no es exactamente así, que nos permite pasar una vez por cada elemento de una colección, como por ejemplo un array, sin necesidad de llevar un contador.

int notas[] = {5, 7, 3, 8};

int suma = 0;
// Para cada 'nota' en el array 'notas'
for (int nota : notas) {
    suma += nota;
    System.out.print(nota + " ");
}
System.out.println("\nNota media = " + (suma/notas.length));

Y ten cuidado, con este bucle no puedes leer datos sobre tipos primitivos como por ejemplo int. Pruébalo.

int notas[] = new int[4];
Scanner sc = new Scanner(System.in);

int suma = 0;
// Para cada 'nota' en el array 'notas'
for (int nota : notas) {
    nota = sc.nextInt();
    suma += nota;
}
// Comprueba como la media es correcta, a pesar de los datos del array
System.out.println("\nNota media de " + Arrays.toString(notas) + " = " + (suma/notas.length));

Otra cuestión con el que te encontrarás con este tipo de bucle es que no puedes saber en un momento dado en qué posición estás, a no ser que uses un contador para hacerlo… ya puestos para eso mejor usas un for normal.

Resumen sobre arrays en Java

Los arrays nos permiten representar matrices, algo útil cuando necesitamos almacenar una serie de datos del mismo tipo.

En los arrays el orden es importante, porque los datos se organizan según un índice o posición correlativo mediante el cual podemos acceder a los mismos.

Finalmente, el recorrido de un array te permite pasar por todos los elementos una vez para operar con ellos de la forma que necesites.

Volver al índice.