1. Introducción
Esta es la primera lección del nivel extra. Ya nos hemos acercado mucho al estudio de la POO. Y quiero avivar tu interés y adelantarme un poco 😈. En este nivel te hablaré de 5 cosas interesantes:
- ♾️ Aprenderás a crear arrays infinitos
- 📖 Luego a llevar un «diccionario personal»
- 💾 Después de eso te presentaré brevemente el trabajo con archivos
- 🌐 Luego aprenderemos a descargar imágenes de Internet
- 🛰️ Y en la última lección del nivel seguirás la Estación Espacial Internacional (EEI) en tiempo real
Cómo funciona todo esto por debajo del capó lo aprenderás en niveles futuros; hoy simplemente aprenderás a usar las herramientas que te proporciono. ¿Intrigado? Entonces, empecemos 😇.
Recordemos los arrays normales
Recordemos un array normal en Java:
int[] arr = new int[10];
Está muy bien, pero tiene un par de limitaciones: el tamaño es fijo; no se puede añadir ni quitar un elemento sin crear un array nuevo. Y a veces queremos un array que crezca y se reduzca según sea necesario. Y tenemos una gran solución — el array dinámico ArrayList!
ArrayList es un «array inteligente» que puede crecer y encogerse automáticamente. A diferencia de un array normal, donde el tamaño es fijo, ArrayList se encarga de que haya espacio para los nuevos elementos.
Creando un array infinito
Para crear nuestro ArrayList, hay que escribir un código como este:
ArrayList<String> array = new ArrayList<String>()
Después de eso, puedes añadir elementos:
array.add("Masha");
array.add("Katya");
Creando un array dinámico para números enteros
Como quizá ya hayas adivinado, el tipo de los elementos de nuestro array dinámico debe indicarse entre corchetes angulares. Se puede indicar cualquier tipo, excepto los tipos primitivos. Los tipos primitivos hay que sustituirlos por sus clases envoltorio.
Ejemplo:
ArrayList<Integer> numbers = new ArrayList<Integer>(); // int
ArrayList<Double> fees = new ArrayList<Double>(); // double
ArrayList<Boolean> yesList = new ArrayList<Boolean>(); // boolean
ArrayList<Character> chars = new ArrayList<Character>(); // char
Nuestro ArrayList no admite [index] para acceder a los elementos, pero tiene métodos específicos que cubren todas tus necesidades. Repasemos los más interesantes.
2. Método add(element) — añadir un elemento
Lo primero que hacemos con una lista es añadirle datos. Para eso sirve el método add. Coloca el elemento al final de la lista.
ArrayList<String> todo = new ArrayList<>(); // lista de tareas
todo.add("Aprender ArrayList");
todo.add("Preparar té");
todo.add("Pasear");
Tras estas tres líneas tenemos una lista de tres cadenas. A diferencia de un array, no necesitamos indicar el tamaño por adelantado — crece sola a medida que vamos añadiendo.
Muy cómodo: puedes empezar con una lista vacía e irla llenando según las acciones del usuario o los datos de entrada del programa.
3. Método get(index) — acceso por índice
Cada elemento de la lista tiene su número de orden — índice. La indexación siempre empieza en cero. Es decir, el primer elemento está con el número 0, el segundo con el número 1, y así sucesivamente.
Si queremos obtener un elemento por su número, usamos el método get.
String task = todo.get(1);
System.out.println("Segunda tarea: " + task);
Salida:
Segunda tarea: Preparar té
Es importante recordarlo: si accedes a un índice que no existe (por ejemplo, todo.get(10) con una lista de tres elementos), el programa lanzará un error IndexOutOfBoundsException. Por eso, siempre debes estar seguro del índice o comprobar el tamaño de la lista con size().
4. Método set(index, element) — sustituir un elemento
A veces hay que reemplazar un elemento en la lista. En ese caso no hace falta eliminar y volver a añadir: basta con usar el método set.
todo.set(1, "Preparar café");
System.out.println("Ahora la segunda tarea: " + todo.get(1));
Salida:
Ahora la segunda tarea: Preparar café
Así, set es una forma de actualizar la lista «al vuelo».
5. Método remove(index) — eliminar un elemento
Puedes eliminar un elemento de ArrayList por índice.
todo.remove(0);
System.out.println("La primera tarea ahora: " + todo.get(0));
Salida:
La primera tarea ahora: Preparar café
Hemos eliminado el primer elemento (índice 0). Ahora el segundo pasó a ser el primero, y el que antes era tercero pasó a ser el segundo. Punto importante: tras eliminar, los elementos de la lista se desplazan.
Esto a veces sorprende a los principiantes. Ten siempre en cuenta que, tras una eliminación, los índices se recalculan.
6. Método size() — obtener el tamaño de la lista
El método size devuelve la cantidad de elementos en la lista. Es parecido a la propiedad length de los arrays, pero en ArrayList es un método.
System.out.println("Total de tareas: " + todo.size());
Salida:
Total de tareas: 2
A menudo size se usa en bucles para recorrer todos los elementos:
for (int i = 0; i < todo.size(); i++)
{
System.out.println(todo.get(i));
}
7. Método contains(element) — comprobar si existe
Para saber si un elemento está en la lista, puedes usar contains. Este método devuelve true o false.
System.out.println(todo.contains("Pasear"));
System.out.println(todo.contains("Preparar té"));
Salida:
true
false
Un método muy útil cuando quieres evitar duplicados o comprobar la condición «¿existe tal elemento en la lista?».
8. Recorrer elementos
Hay dos formas de recorrer la lista.
Bucle por índice
Este método es útil si te importa el número del elemento.
for (int i = 0; i < todo.size(); i++)
{
System.out.println(i + ": " + todo.get(i));
}
Bucle for-each
Y si el número no te importa y solo quieres ver todos los elementos — usa un bucle for-each.
for (String task : todo)
{
System.out.println("Tarea: " + task);
}
Este bucle es más corto y se lee más fácilmente.
9. Práctica: ArrayList en tu aplicación
Hagamos una lista de tareas que se pueda ir completando y mostrar:
import java.util.ArrayList;
import java.util.Scanner;
public class TodoApp
{
public static void main(String[] args)
{
ArrayList<String> todo = new ArrayList<>();
Scanner console = new Scanner(System.in);
while (true)
{
System.out.print("Introduce una tarea (o una línea vacía para salir): ");
String task = console.nextLine();
if (task.isEmpty()) break;
todo.add(task);
}
System.out.println("Tu lista de tareas:");
for (int i = 0; i < todo.size(); i++)
{
System.out.println((i + 1) + ". " + todo.get(i));
}
}
}
Espero que te haya gustado nuestro array infinito. Es la primera de las colecciones de Java con la que te has familiarizado. Creo que las demás también te gustarán.
GO TO FULL VERSION