Saltar a contenido

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();
    }
}