Semana 11: ArrayList (Java)
¿Qué es ArrayList?
ArrayList es una lista dinámica que:
- Mantiene orden de inserción.
- Permite duplicados y
null. - Accede por índice en
O(1). - Se redimensiona automáticamente.
Importación y creación
import java.util.ArrayList;
import java.util.List;
public class Main {
public static void main(String[] args) {
// Programar contra la interfaz List
List<String> nombres = new ArrayList<>();
System.out.println(nombres); // []
}
}
Operaciones básicas
import java.util.ArrayList;
import java.util.List;
public class Main {
public static void main(String[] args) {
List<String> frutas = new ArrayList<>();
// Añadir al final
frutas.add("Manzana");
frutas.add("Banana");
frutas.add("Naranja");
// Insertar en índice
frutas.add(1, "Pera");
// Obtener/modificar por índice
String primera = frutas.get(0); // "Manzana"
frutas.set(2, "Uva"); // reemplaza "Banana" -> "Uva"
// Eliminar
frutas.remove(3); // por índice
frutas.remove("Pera"); // por objeto (primera aparición)
// Tamaño y chequeos
System.out.println(frutas); // [Manzana, Uva]
System.out.println(frutas.size()); // 2
System.out.println(frutas.isEmpty()); // false
System.out.println(frutas.contains("Uva")); // true
}
}
Recorrer la lista
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
public class Main {
public static void main(String[] args) {
List<Integer> numeros = new ArrayList<>();
numeros.add(10);
numeros.add(20);
numeros.add(30);
// 1) for con índice
for (int i = 0; i < numeros.size(); i++) {
System.out.println("i=" + i + ", valor=" + numeros.get(i));
}
// 2) for-each
for (Integer n : numeros) {
System.out.println("n=" + n);
}
// 3) Iterator (permite eliminar seguro mientras iteras)
Iterator<Integer> it = numeros.iterator();
while (it.hasNext()) {
Integer n = it.next();
if (n == 20) {
it.remove(); // elimina 20 sin ConcurrentModificationException
}
}
System.out.println(numeros); // [10, 30]
}
}
Métodos útiles
import java.util.ArrayList;
import java.util.List;
public class Main {
public static void main(String[] args) {
List<String> lista = new ArrayList<>();
lista.add("A");
lista.add("B");
lista.add("C");
lista.add("B");
// indexOf / lastIndexOf
int primeraB = lista.indexOf("B"); // 1
int ultimaB = lista.lastIndexOf("B"); // 3
// subList (vista de la lista original)
List<String> sub = lista.subList(1, 3); // elementos en [1, 3)
System.out.println(sub); // [B, C]
// removeIf (Java 8+)
lista.removeIf(s -> s.equals("B")); // elimina todas las "B"
System.out.println(lista); // [A, C]
// clear
lista.clear(); // []
}
}
Ordenar y comparar
import java.util.*;
public class Main {
// Métodos auxiliares estáticos (sin clases adicionales)
static void ordenarEnteros() {
List<Integer> nums = new ArrayList<>(Arrays.asList(7, 3, 9, 1));
nums.sort(Comparator.naturalOrder());
System.out.println(nums); // [1, 3, 7, 9]
nums.sort(Comparator.reverseOrder());
System.out.println(nums); // [9, 7, 3, 1]
}
static void ordenarStrings() {
List<String> nombres = new ArrayList<>(Arrays.asList("Ana", "luis", "Marta", "carlos"));
// Alfabético considerando mayúsculas/minúsculas
nombres.sort(Comparator.naturalOrder());
System.out.println(nombres);
// Alfabético ignorando mayúsculas/minúsculas
nombres.sort(String.CASE_INSENSITIVE_ORDER);
System.out.println(nombres);
// Por longitud
nombres.sort(Comparator.comparingInt(String::length));
System.out.println(nombres);
}
public static void main(String[] args) {
ordenarEnteros();
ordenarStrings();
}
}
Búsqueda
import java.util.*;
public class Main {
public static void main(String[] args) {
List<Integer> nums = new ArrayList<>(Arrays.asList(7, 3, 9, 1));
// contains / indexOf
System.out.println(nums.contains(9)); // true
System.out.println(nums.indexOf(3)); // puede ser 1
// binarySearch requiere lista ORDENADA
Collections.sort(nums); // [1, 3, 7, 9]
int pos = Collections.binarySearch(nums, 7); // índice 2
System.out.println(pos);
}
}
Conversión a arreglo
import java.util.*;
public class Main {
public static void main(String[] args) {
List<String> lista = new ArrayList<>(Arrays.asList("X", "Y"));
// a Object[]
Object[] arr1 = lista.toArray();
// a String[]
String[] arr2 = lista.toArray(new String[0]);
System.out.println(arr1.length + ", " + arr2.length);
}
}
Complejidad (Big-O)
add(E)al final:O(1)amortizada.add(i, E)en medio:O(n).get(i)/set(i, E):O(1).remove(i)/remove(Object):O(n).contains/indexOf:O(n).- Recorrer toda la lista:
O(n).
Mini-proyecto: Lista de tareas
import java.util.*;
public class Main {
// Representación simple sin clases adicionales
static List<String> tareas = new ArrayList<>();
static List<Boolean> hechas = new ArrayList<>();
static void añadir(String titulo) {
tareas.add(titulo);
hechas.add(false);
}
static void marcarHecha(int i) {
if (i >= 0 && i < tareas.size()) {
hechas.set(i, true);
}
}
static void eliminar(int i) {
if (i >= 0 && i < tareas.size()) {
tareas.remove(i);
hechas.remove(i);
}
}
static void listar() {
for (int i = 0; i < tareas.size(); i++) {
System.out.println(i + ": " + (hechas.get(i) ? "[x] " : "[ ] ") + tareas.get(i));
}
}
public static void main(String[] args) {
añadir("Estudiar ArrayList");
añadir("Hacer ejercicios");
listar();
marcarHecha(0);
eliminar(1);
listar();
}
}