Listas
Listas (interfaz List)
Es una colección de objetos en forma de nodos enlazados, donde poder insertar los objetos de manera dinámica y flexible. La interfaz List es la base para las colecciones que vamos a ver
Las dos implementaciónes más usadas de list son: ArrayList y LinkedList
ArrayList
Los elementos se guardan en una estructura de array dinámico. Es muy eficiente para recorrer todos los elementos, y algo más lento en insertar y borrar los objetos.
Crear un ArrayList
List<String> listStrings = new ArrayList<String>();
listStrings.add("One");
listStrings.add("Two");
listStrings.add("Three");
listStrings.add("Four");
System.out.println(listStrings);
Versión a partir de JDK7 (sintaxis más corta):
List<String> listStrings = new ArrayList<>();
listStrings.add("One");
listStrings.add("Two");
listStrings.add("Three");
listStrings.add("Four");
System.out.println(listStrings);
Forma alternativa y rápida (versiones ultimas de JDK) List.of: Se crea una lista de Integers indexados, a partir del método estático. Pero ojo se crea una lista inmutable -> nose puede modificar (concepto que veremos más adelante)
List<Integer> listNumbers = List.of(1, 2, 3, 4, 5, 6);
Alternativa y que nos genere algo modificable, usando el constructor de ArrayList:
ArrayList<Integer> listaEspecial = new ArrayList<>(List.of(1, 2, 3, 4, 5, 6));
listaEspecial.add(9);
listaEspecial.forEach(l -> System.out.println(l));
Crear una ArrayList a partir de otro (volcado de elementos): usando el constructor con parámetro
List<Integer> listNumberOne; // existing collection
List<Integer> listNumberTwo = new ArrayList<>(listNumberOne);
Agregar objetos
Método add, que tiene dos versiones: add(Object): inserta en lista el objeto en la posición última. add(index, Object): insertar en la posición index el objeto
List<String> listStrings = new ArrayList<>();
listStrings.add("One");
listStrings.add("Two");
listStrings.add("Three");
listStrings.add(1, "Four");
Método addAll: agrega los objetos de una lista a otra (existe la versión con índice a partir de una posición se vuelcan).
listStrings.addAll(listWords);
listStrings.addAll(2, listWords);
Obtener objeto
Con el metodo get y un número se obtiene el objeto de dicha posición
String element = listStrings.get(1);
Actualizar objeto
Para ello tenemos el método set, especificando cual con la posición del arrayList:
listStrings.set(2, "Hi");
Eliminar objetos de la lista
Tenemos el método remove, y con un índice indicamos que objeto queremos eliminar de la lista, este método siempre es conveniente comprobar con el tamaño de la lista (size) que la posición existe:
listStrings.remove(2);
Para vaciar toda lista existe el clear().
Buscar objeto en la lista
Se pueden usar los métodos contains (devuelve booleano) y indexOf (devuelve la posición). Ejemplo:
import java.util.*;
public class ListaDemo3 {
public static void main(String[] args) {
List<String> lista = new ArrayList<>();
String s = "bye";
lista.add("hi");
lista.add(s);
System.out.println("hello está en la lista? " + lista.contains("hello"));
System.out.println("bye está en la lista? " + lista.contains("bye"));
System.out.println(s + " está en la lista? " + lista.contains(s));
System.out.println("posición de " + s + " en la lista? " + lista.indexOf(s));
}
}
Recorrer la lista
Hay muchas posibilidades para este menester, estas son las más típicas: For normal:
for (String element : listStrings) {
System.out.println(element);
}
Uso de Iterator o ListIterator (más posibilidades de recorrer y modificar), con esta forma los métodos imprescindibles:
- next(): mueve el puntero de objeto a objeto, pero antes se obtiene el objeto
- hasNext():devuelve verdadero si hay objeto en la siguiente posición. Ejemplo:
Libro libro1 = new Libro("0345404475", "Do Androids Dream of Electric Sheep?", "Philip K.Dick");
Libro libro2 = new Libro("0451457998", "2001: A Space Odissey", "Arthur C. Clarke");
List<Libro> biblio = new ArrayList<>()
biblio.add(libro1);
biblio.add(libro2);
Iterator<Libro> it = biblio.iterator(); // Iterator que apuntará al inicio de la colección
while(it.hasNext()) { // mientras haya "siguiente" elemento...
Libro libro = it.next(); // leemos el "siguiente" elemento
System.out.println("Título: " + libro));
}
ListIterator: métodos a parte de los de recorrido que podéis probar: add(), remove() y set() enlace a javadoc
Desde Java 8, se puede usar el forEach() con lambda:
listStrings.forEach(s -> System.out.println(s));
Volcar Array a List
Tenemos de la clase vista anteriormente Arrays un metodo muy cómodo que es asList. Ejemplo:
String[] array = {"new", "String", "array"};
List<String> list = Arrays.asList(array);
// y es modificafle es decir no inmutable
Ejercicios
Ejercicio 1:
Realiza un pequeño programa de agenda de personas, los datos recogidos serán número de telefono y nombre. El programa debe almacenar los contactos, nos debe dar el número de contactos de la agenda,listar la agenda (prueba todas las formas vistas), eliminar un contacto y resetear la agenda. Utiliza un ArrayList.
Ejercicio 2:
Escribe un método denominado swapPairs que intercambie los valores de un ArrayList de Strings por parejas. Es decir, intercambiará el primer elemento con el segundo, el tercero con el cuarto,…
En caso de que el número de elementos sea impar, el último elemento no se intercambiará.
Ejercicio 3:
Escribe un método denominado minToFront que reciba un ArrayList de enteros y mueva el mínimo de ellos al comienzo de la lista, manteniendo el orden del resto de números
Puedes asumir que la lista tendrá, al menos, un elemento. Por ejemplo: Test: 3, 8, 92, 4, 2, 17, 9 Resultado: [2, 3, 8, 92, 4, 17, 9]
Ejercicio 4:
Escribe un método denominado markLength4 que reciba un ArrayList de Strings como argumento e inserta la cadena “****” en frente de cada elemento que tenga 4 caracteres. Por ejemplo: Test: “this”, “is”, “lots”, “of”, “fun”, “for”, “every”, “Java”, “programmer” Resultado: **** , this, is, **** , lots, of, fun, for, every, ****, Java, programmer
Ejercicio 5:
Escribe un método denominado filterRange que reciba tres parámetros: un ArrayList de enteros, un valor min y un valor max. El método debe eliminar de la lista todos los elementos cuyo valor se encuentren en el rango [min, max]. Por ejemplo: Test: List lista = new ArrayList<>(Arrays.asList(new Integer[]{4, 7, 9, 2, 7, 7, 5, 3, 5, 1, 7, 8, 6, 7})); filterRange(lista, 5, 7); Resultado: [4, 9, 2, 3, 1, 8]
LinkedList
El diseño de esta colección de objetos varia a la del un ArrayList, en este caso es una lista enlazada. Y es más eficiente en inserciones y borrado de objetos. Ahora veremos sólo lo diferente al ArrayList.
Crear un LinkedList
List<String> listStrings = new LinkedList<>();
Obtener objeto en LinkedList
Con este implementación de List tenemos dos métodos bastante útiles: getFirst() y getLast(). Ejemplo:
LinkedList<Number> numbers = new LinkedList<Number>();
// add elements to the list...
// get the first and the last elements:
Number first = numbers.getFirst();
Number last = numbers.getLast();
Ejercicios Extra
Ejercicio 6:
Partiendo del esta interfaz:
public interface Ejercicio6 {
void insert(Object x); //Inserta x
void remove(Object x ); //Elimina el primer x
void removeCurrent(); //Elimina el elemento current
boolean find(Object x); //Coloca current para poder ver x
void goFirst(); // Coloca current en la primera posición
void advance(); // Avanza current al siguiente nodo
boolean isOnList(); //No está vacía
Object getCurrent(); //Elemento en la posición current
Object getPrevious(); // Elemento de la posición anterior al current
}
Nos piden que implementemos dichas funcionalidades con la colección LinkedList, sobre un programa de reservas para un avión. Todas las reservas serán de un mismo avión. Los datos necesarios son origen, destino, plaza, businnes y los datos del pasajero (dni, nombre, apellidos, edad y nacionalidad).