Listado completo de tutoriales

74 - Colecciones: ArrayList


La clase ArrayList implementa la lógica para trabajar con listas genéricas, es decir podemos insertar y extraer elementos de cualquier parte de la lista. La diferencia del ArrayList con la clase LinkedList es la implementación interna de los algoritmos. La clase LinkedList emplea una lista doblemente encadenada y la clase ArrayList utiliza un arreglo que se redimensiona en forma automática según se efectúan inserciones y extracciones de datos.

La principal ventaja de emplear la clase ArrayList es que el acceso a un elemento de la lista es inmediato mediante el método 'get', en cambio la implementación del método 'get' en la clase LinkedList requiere recorrer en forma secuencial la lista hasta llegar a la posición a buscar.

Si la lista no va ha tener grandes cambios en inserciones y extracciones durante la ejecución del programa es más común utilizar la clase ArrayList en lugar de LinkedList.

Confeccionaremos el mismo programa que hicimos con la clase LinkedList pero empleando ahora la clase ArrayList.

Programa:

import java.util.ArrayList;

public class PruebaArrayList {
    public static void imprimir(ArrayList<String> lista) {
        for (String elemento : lista)
            System.out.print(elemento + "-");
        System.out.println();
    }

    public static void main(String[] args) {
        ArrayList<String> lista1 = new ArrayList<String>();

        lista1.add("juan");
        lista1.add("Luis");
        lista1.add("Carlos");

        imprimir(lista1);
        lista1.add(1, "ana");
        imprimir(lista1);
        lista1.remove(0);
        imprimir(lista1);
        lista1.remove("Carlos");
        imprimir(lista1);
        System.out.println("Cantidad de elementos en la lista:" + lista1.size());
        if (lista1.contains("ana"))
            System.out.println("El nombre 'ana' si esta almacenado en la lista");
        else
            System.out.println("El nombre 'ana' no esta almacenado en la lista");
        System.out.println("El segundo elemento de la lista es:" + lista1.get(1));
        lista1.clear();
        if (lista1.isEmpty())
            System.out.println("La lista se encuentra vacía");
    }

}

Para trabajar con una lista implementada en forma interna con un arreglo debemos importar la clase ArrayList:

import java.util.ArrayList;

Creamos un objeto de la clase ArrayList:

        ArrayList<String> lista1 = new ArrayList<String>();

La lista administra objetos de la clase String, luego mediante el método 'add' añadimos componentes al final:

        lista1.add("juan");
        lista1.add("Luis");
        lista1.add("Carlos");

Llamamos al método estático 'imprimir' para mostrar todos los elementos del ArrayList:

        imprimir(lista1);

El método estático recibe la lista y mediante un for recorre la colección mostrando sus elementos:

    public static void imprimir(ArrayList<String> lista) {
        for (String elemento : lista)
            System.out.print(elemento + "-");
        System.out.println();
    }

El método 'add' de la clase ArrayList se encuentra sobrecargado, hay un segundo método 'add' con dos parámetros que recibe en el primer parámetro la posición donde se debe insertar el nodo y como segundo parámetro el dato a almacenar (tener en cuenta que internamente el ArrayList debe desplazar todos los elementos a derecha una posición):

        lista1.add(1, "ana");

Para eliminar un nodo de la lista debemos llamar al método 'remove' y pasar la posición del nodo a eliminar:

        lista1.remove(0);

También podemos eliminar los elementos que coinciden con cierta información:

        lista1.remove("Carlos");

La cantidad de elementos nos lo suministra el método 'size':

        System.out.println("Cantidad de elementos en la lista:" + lista1.size());

Para conocer si la lista almacena cierto valor disponemos del método 'contains':

        if (lista1.contains("ana"))
            System.out.println("El nombre 'ana' si esta almacenado en la lista");
        else
            System.out.println("El nombre 'ana' no esta almacenado en la lista");

Para recuperar el dato de un nodo sin eliminarlo podemos hace uso del método 'get' (en un ArrayList este método es muy rápido y no depende de la cantidad de elementos):

        System.out.println("El segundo elemento de la lista es:" + lista1.get(1));

Eliminamos todos los nodos de la lista mediante el método 'clear':

        lista1.clear();

Podemos consultar si la lista se encuentra vacía mediante el método 'isEmpty':

        if (lista1.isEmpty())
            System.out.println("La lista se encuentra vacía");

Más datos podemos conseguir visitando la documentación oficial de la clase ArrayList.

Problema

Crear un proyecto y dentro del mismo crear dos clases. La primer clase se debe llamar 'Carta', con dos atributos el palo y el número de carta. Por otro lado declarar una clase llamada 'Mazo' que contenga un ArrayList de tipo 'Carta'. Imprimir las cartas en forma ordenadas según como se insertaron y luego mezclar y volver a imprimir.

Programa:

public class Carta {
    public enum Palo {
        TREBOL, DIAMANTE, CORAZON, PICA
    };

    private int numero;
    private Palo palo;

    Carta(int numero, Palo palo) {
        this.numero = numero;
        this.palo = palo;
    }

    public void imprimir() {
        System.out.println(numero + " - " + palo.toString().toLowerCase());
    }

    public Palo retornarPalo() {
        return palo;
    }

}
import java.util.ArrayList;
import java.util.Collections;

public class Mazo {
    private ArrayList<Carta> cartas;

    Mazo() {
        cartas = new ArrayList<Carta>(8);
        cartas.add(new Carta(1, Carta.Palo.TREBOL));
        cartas.add(new Carta(2, Carta.Palo.TREBOL));
        cartas.add(new Carta(1, Carta.Palo.DIAMANTE));
        cartas.add(new Carta(2, Carta.Palo.DIAMANTE));
        cartas.add(new Carta(1, Carta.Palo.PICA));
        cartas.add(new Carta(2, Carta.Palo.PICA));
        cartas.add(new Carta(1, Carta.Palo.CORAZON));
        cartas.add(new Carta(2, Carta.Palo.CORAZON));
    }

    public void imprimir() {
        for (Carta carta : cartas)
            carta.imprimir();
    }

    public void barajar() {
        Collections.shuffle(cartas);
    }

    public static void main(String[] ar) {
        Mazo mazo = new Mazo();
        System.out.println("Mazo de cartas ordenado");
        mazo.imprimir();
        mazo.barajar();
        System.out.println("Mazo de cartas despues de barajar");
        mazo.imprimir();
    }

}

La clase Carta ya la analizamos en conceptos anteriores, veamos lo principal de la clase Mazo.

Definimos un ArrayList llamado cartas:

    private ArrayList<Carta> cartas;

En el constructor creamos el ArrayList pasando el valor 8 ya que ese será el número de cartas de nuestro mazo (si no pasamos el 8 el ArrayList se redimensiona automáticamente, el pasar un valor es conveniente para que sea más eficiente el programa):

Mazo() { cartas = new ArrayList<Carta>(8);

Agregamos al ArrayList los 8 elementos:

        cartas.add(new Carta(1, Carta.Palo.TREBOL));
        cartas.add(new Carta(2, Carta.Palo.TREBOL));
        cartas.add(new Carta(1, Carta.Palo.DIAMANTE));
        cartas.add(new Carta(2, Carta.Palo.DIAMANTE));
        cartas.add(new Carta(1, Carta.Palo.PICA));
        cartas.add(new Carta(2, Carta.Palo.PICA));
        cartas.add(new Carta(1, Carta.Palo.CORAZON));
        cartas.add(new Carta(2, Carta.Palo.CORAZON));

Para imprimir todas las carta recorremos la colección mediante un for:

    public void imprimir() {
        for (Carta carta : cartas)
            carta.imprimir();
    }

Para mezclar las cartas la forma más sencilla es emplear el método estático 'shuffle' que pertenece a la clase 'Collections':

    public void barajar() {
        Collections.shuffle(cartas);
    }

Es importante hacer el import tanto de la clase ArrayList como de Collections:

import java.util.ArrayList;
import java.util.Collections;

En el método main solo nos queda crear un objeto de la clase 'Mazo' proceder a imprimir todo el mazo, seguidamente mezclar las cartas y volver a imprimir:

    public static void main(String[] ar) {
        Mazo mazo = new Mazo();
        System.out.println("Mazo de cartas ordenado");
        mazo.imprimir();
        mazo.barajar();
        System.out.println("Mazo de cartas despues de barajar");
        mazo.imprimir();
    }

Retornar