Programación

1º DAM/DAW - Curso 2023-2024

User Tools

Site Tools


apuntes:arrays

Los arrays

Arrays unidimensionales

Un array es una estructura de datos que permite almacenar un número indeterminado de variables del mismo tipo, que son referenciadas por el mismo identificador.

Dentro del array, cada valor ocupa una posición y se puede recuperar o modificar su valor combinando el identificador y dicha posición.

Figure 1: Array (fuente:geeksforgeeks.org)

Como se puede observar en la figura, la primera posición del array es la posición 0. Como consecuencia, la última posición del array será igual a la longitud del mismo menos uno.

Declaración del array

El array se declara como una variable, indicando tipo e identificador, acompañado de los caracteres [ y \verb ] que lo caracterizan, puesto que son los caracteres que se emplean para referirse a alguna posición del mismo.

Una vez declarado puede ser instanciado con la instrucción \verb new seguido del tipo e indicando el número de elementos para los que se quiere reservar espacio en memoria, tal y como se indica a continuación. En este caso, para asignar valor a cada uno de los espacios que se han reservado se puede acceder al array e indicar la posición para la que se quiere asignar

String[] telefonos = new String[5];
telefonos[0] = "976123456";

También es posible inicializar los valores de un array aprovechando una estructura de bucle como for de forma que se puede asignar a cada elemento del mismo, posición por posición.

String[] telefonos = new String[5];
for (int i = 0; i < telefonos.length; i++) {
    telefonos[i] = " . . . ";
}

También es posible crear un array asignando directamente los valores que queremos que contenga el mismo. En ese caso se declara un array con la capacidad justa para almacenar todos los valores especificados.

String[] telefonos = {"976123456", "91123456", "986789876"}

Hay que tener en cuenta que pueden crear arrays de tipos primitivos y clases Java, y también de cualquier clase de las que hayas programado en el proyecto. En ese caso, se crea una estructura que almacena las referencias a todos los objetos que se creen en cada una de ellas.

Moto[] misMotos = new Moto[10];

En cualquier caso, un array es una referencia a la estructura donde se almacenan sus valores (o sus referencias, si es un array de objetos), por lo que si se pasa como parámetro a un método, se pasará como referencia.

array1.jpg
Figure 2: Array unidimensional (fuente:geeksforgeeks.org)

Utilización del array

La utilización del array es muy sencilla. Cada elemento del mismo, una vez indicada la posición, se puede tratar como una variable del mismo tipo que el array, por lo que las operaciones que se pueden hacer con cada elemento son las mismas que se pueden hacer sobre variables individuales.

Moto[] misMotos = new Moto[10];
// Poblar el array . . .
. . .
for (int i = 0; i < misMotos.length; i++) {
    misMotos[i].pasarRevision();    // podemos invocar al método de cada elemento del array
}

También se puede declarar una variable para tomar la referencia del emento del array. A veces es más cómodo para acceder a los métodos del objeto.

Moto[] misMotos = new Moto[10];
// Poblar el array . . .
. . .
for (int i = 0; i < misMotos.length; i++) {
    Moto moto = misMotos[i];
    if (!moto.estaRevisada()) {
        moto.pasarRevision();
    }
}

Los arrays se pueden pasar como parámetro a un método, y lo harán por referencia:

int[] numeros = new int[5];
for (int i = 0; i < numeros.length; i++) {
    numeros[i] = 10;
}
incrementar(numeros);
System.out.println(numeros[3]);     // 11
. . .
. . .
public void incrementar(int[] valores) {
    for (int i = 0; i < valores.length; i++) {
        valores[i]++;
    }
}

Arrays bidimensionales

Los arrays bidimensionales, también llamados matrices, son arrays en dos dimensiones. En la práctica se puede interpretar como un array unidimensional en el que hay almacenado otro array en cada elemento del primero.

array2.jpg
Figure 3: Array bidimensional (fuente:geeksforgeeks.org)

Se declaran e inicializan de la misma manera que los arrays unidimensionales, pero esta vez hay que tratar con dos dimensiones. Al poderse interpretar como una matriz, la primera dimensión hará referencia a las filas, y la segunda a las columnas

String[][] telefonos = new String[5][6];
telefonos[0][0] = "976123456";

También es posible inicializar los valores de un array aprovechando una estructura de bucle como for de forma que se puede asignar a cada elemento del mismo, posición por posición. En este caso será necesario anidar dos bucles para acceder a las dos dimensiones del array.

String[][] telefonos = new String[5][6];
for (int i = 0; i < telefonos.length; i++) {
    for (int j = 0; j < telefonos[0].length; j++) {
        telefonos[i][j] = " . . . ";
    }
}

También es posible crear un array bidimensional asignando directamente los valores que queremos que contenga el mismo. En ese caso se declara un array con la capacidad justa para almacenar todos los valores especificados.

String[] telefonos = {{"976123456", "91123456", "986789876"}, { . . .}, . . . }

Y, por supuesto, también podemos crear arrays bidimensionales de objetos:

Moto[][] misMotos = new Moto[10][2];

Manipulaciones habituales con arrays

En Java disponemos de la clase \verb Arrays que facilita algunas de las operaciones más comunes que se pueden llevar a cabo con los arrays:

  • Arrays.binarySearch() Busca en un array un elemento que se pasa como parámetro. Devolverá la posición donde lo encuentra o el valor -1 si no existe. Hay que tener en cuenta que el array deberá de estar ordenado.
int[] numeros = new int[10];
for (int i = 0; i < numeros.length; i++) {
    numeros[i] = i * 10;
}
int resultado = Arrays.binarySearch(numeros, 20);
System.out.println(resultado);  // 2
  • Arrays.copyOf() Permite copiar el array a otro de diferente longitud (mayor o menor), rellenando o truncando los valores nuevos o eliminados, respectivamente. Devuelve el array resultante
int[] numeros = new int[5];
 
int[] masNumeros = Arrays.copyOf(numeros, 10);
System.out.println(masNumeros.length);  // 10
  • Arrays.equals() Comprueba si dos arrays son iguales. Devuelve un valor booleano indicando si son o no iguales
int[] numeros = {1, 3, 4};
int[] otrosNumeros = {1, 3, 4};
 
System.out.println(Arrrays.equals(numeros, otrosNumeros)); // true
  • Arrays.fill() Rellena un array con el valor que se le pasa como parámetro
int[] numeros = new int[3];
 
Arrays.fill(numeros, 5);
System.out.println(Arrays.toString(numeros));   // [5, 5, 5]
  • Arrays.sort() Ordena el array que se pasa como parámetro
int[] numeros = {4, 10, 3, 6}
Arrays.sort(numeros);
System.out.println(Arrays.toString(numeros));   // [3, 4, 6, 10]
  • Arrays.toString() Devuelve una representación en String del array que se pasa como parámetro
int[] numeros = {10, 20, 30, 5}
System.out.println(Arrays.toString(numeros));   // [10, 20, 30, 5]

Bucle for mejorado

En Java, existe lo que se conoce como bucle for-each. Es un tipo de bucle mejorado para el caso en que se quiera recorrer un array y acceder a cada uno de los elementos del mismo. Por eso, no es necesario utilizar variable auxiliar para el índice ni asignar cada elemento del array para trabajar sobre él, lo hará automáticamente la propia estructura del bucle:

Moto[] motos = new Moto[10];
. . .
for (Moto moto : motos) {
    // Se ejecuta este método para todos los elementos del array
    moto.viajar("Zaragoza", "Madrid");
}

Y además, en el caso de que exista alguna excepción, siempre puede romperse el bucle (con break) o saltarse alguna iteración (con continue.

Moto[] motos = new Moto[10];
. . .
for (Moto moto : motos) {
    // Si la moto no esta revisada pasamos a la siguiente
    if (!moto.estaRevisada()) {
        continue;
    }
 
    moto.viajar("Zaragoza", "Madrid");
    moto. . . .
    . . .
}

© 2019-2024 Santiago Faci

apuntes/arrays.txt · Last modified: 2022/10/09 16:45 by Santiago Faci