Está en la página 1de 42

Lista, Stack, Cola y Colas de

prioridad en Java

1
Introducción
• Elegir las mejores estructuras de datos y algoritmos
para una tarea en particular es una de las claves
para desarrollar software de alto rendimiento.

• Una estructura de datos es una colección de datos


organizados de alguna manera. La estructura no solo
almacena datos sino también admite operaciones para
acceder y manipular los datos.

• En el pensamiento orientado a objetos, una estructura


de datos, también conocida como contenedor u objeto
contenedor, es un objeto que almacena a otros
objetos, conocidos como datos o elementos.
2
Colecciones
• La interfaz Collection define las operaciones más
comunes para listas, vectores, pilas, colas, colas de
prioridad y conjuntos (set).

• El Java Collections Framework admite dos tipos de


contenedores:
• collection.
• map (clave/valor).

• Los mapas son estructuras de datos eficientes para


buscar rápidamente usando clave.

3
Colecciones
• Sets almacena un grupo de elementos no duplicados.
• List almacenan una colección ordenada de elementos.
• Stack Apila los objetos, se procesan en un estilo LIFO (Last In –
First Out) último en entrar, primero en salir.
• Queue Las colas almacenan los objetos que se procesan en un
estilo FIFO (First in, First Out) primera entrar, primero en salir.
• PriorityQueues almacena objetos que se procesan en el orden de
sus prioridades

Las características comunes de estas colecciones se definen en las


interfaces y las implementaciones se proporcionan en clases
concretas, como se muestra en la siguiente lámina

4
Collection

Una collection es un container que almacena objetos


5
Diseño del Framework
• El diseño del Framework Collections de Java es un excelente
ejemplo del uso de interfaces, clases abstractas y clases
concretas.
• Las interfaces definen el Framework (marco). Las clases
abstractos proporcionan implementación parcial. Las clases
concretas implementan las interfaces con estructuras de datos
específicas
• Proporcionar una clase abstracta que implemente parcialmente la
interfaz hace que sea conveniente para el usuario escribir el
código. El usuario puede simplemente definir una clase concreta
que amplíe la clase abstracta en lugar de implementar todos los
métodos en La interfaz.
• Las clases abstractas tales como AbstractCollection se
proporcionan para conveniencia. Por esta razón, se llaman clases
abstractas de conveniencia.
6
Diseño de colecciones

La interfaz Colección es la interfaz raíz para


manipular una colección de objetos.
La clase AbstractCollection proporciona
parcial implementación para la interfaz de
Colección.
Implementa todos los métodos en la Colección
excepto los métodos add(), size() e iterator.
Estos se implementan en concreto en la sub
clase apropiada.
7
8
Interfaz Colección

• La interfaz de Colección proporciona las


operaciones básicas para agregar y eliminar
elementos en una colección.

• Los métodos addAll, removeAll y retainAll


son similares a las operaciones de
intersección unión y diferencia.

9
Ejemplo de uso

10
11
12
Iterador

• Cada colección es Iterable. Puede obtener su objeto iterador para


recorrer todos los elementos en la colección.

• La interfaz Iterator proporciona una manera uniforme para


atravesar elementos en varios tipos de colecciones.

• El método iterator () en la interfaz Iterable devuelve una


instancia de Iterator que proporciona acceso secuencial a los
elementos en la colección usando el método next (). El método
hasNext () para verificar si hay más elementos en el iterador, y el
método remove () para eliminar el último elemento devuelto por
el iterador.

13
java.util.Iterator<E>
 Piense en los escenarios de uso típicos para Colecciones
◦ Recupere la lista de todos los pacientes
◦ Buscar el item de precio menor
 Más a menudo deseamos recorrer cada elemento en la
colección – sea una List, Set, o su propia estructura de datos
 Iterators provee una forma genérica para recorrer a través de
una colección independientemente de su implementación
a Set
iterator() c
next():d f
g
d h
a b c d e f g h i b e
i
hasNext()?
List
Iterator
iterator() a b c d e f g h i

14
Usando un Iterator
 Fragmento de código esencia para la iteración en la colección:

public void list(Collection<Item> items) {


<<interface>>
Iterator<Item> it = items.iterator();
Iterator<E>
while(it.hasNext()) {
Item item = it.next(); +hasNext():boolean
System.out.println(item.getTitle()); +next():E
+remove():void
}
}

Notas de diseño:
Los método de arriba se asumen en un objeto cuya clase implementa Collection
List, ArrayList, LinkedList, Set, HashSet, TreeSet, cola, MyOwnCollection, etc
Sabemos que tales objetos puede devolver un iterador a través del método iterador()
No sabemos la aplicación exacta de Iterator que estamos recibiendo, pero no nos
importa, siempre y cuando proporciona los métodos next() y hasNext()

15
java.lang.Iterable<T>
Iterator<Item> it = items.iterator();
for (Item item : items) { while(it.hasNext()) {

}
System.out.println(item); = Item item = it.next();
System.out.println(item);
}

Es la sentencia “for-each” <<interface>>


Para cada item in items Iterable<T>
Esto es posible siempre y cuando los items son de tipo
+iterator():Iterator<T>
Iterable
Define un solo metodo iterator()
Colección (y por lo tanto todas sus
subinterfaces) Iterable
Collection<T> MyBag<T>
Usted puede hacer esto en su propia implementación de
Iterable
etc
Set<T> List<T>

16
17
Listas

• La interfaz de List extiende la interfaz de


colección y define una colección para
almacenar elementos en un orden
secuencial.
• Para crear una lista, use uno de sus dos
clases: ArrayList o LinkedList.

18
Métodos de la interfaz Lista

• ArrayList y LinkedList se definen en la


interfaz de List. La interfaz List extiende la
Colección para definir una colección
ordenada con elementos duplicados.

• La interfaz List agrega operaciones


orientadas a la posición, así como un nuevo
iterator de lista que permite al usuario
atravesar la lista bidireccionalmente
19
Interface List

20
ListIterator
• El método listIterator () o listIterator (startIndex) devuelve una
instancia de ListIterator. La interfaz ListIterator amplía la
interfaz Iterator para agregar recorrido bidireccional de la lista.

21
Las Clases ArrayList y LinkedList
• Las clases ArrayList y LinkedList son dos implementaciones
concretas de la Interfaz List

• ArrayList almacena elementos en un arreglo. El arreglo se crea


dinámicamente. Si se excede la capacidad del arreglo, se crea
una nuevo arreglo más grande y todos los elementos del arreglo
actual se copia al nuevo arreglo.

• LinkedList almacena elementos en una lista enlazada.

• ¿Cuál de las dos clases que usa depende de sus necesidades


específicas? Si necesitas apoyar acceso aleatorio a través de un
índice sin insertar o eliminar elementos al principio de la lista,
ArrayList ofrece la colección más eficiente. Si, sin embargo, su
aplicación requiere la inserción o eliminación de elementos al
principio de la lista, debe elegir LinkedList.
22
ArrayList

23
TestArrayAndLinkedList.java

24
TestArrayAndLinkedList.java

25
TestArrayAndLinkedList.java

26
Interfaz Comparator
• El comparador se puede usar para comparar los objetos de una clase que
no implementa Comparable.
• Puede definir un comparador para comparar los elementos de diferentes
clases.
• Para hacerlo, defina una clase que implemente la interfaz
java.util.Comparator <T> y reescriba el método compare.

public int compare (elemento T1, elemento T2)


Devuelve un valor:
negativo si element1 es menor que element2,
un valor positivo si element1 es mayor que element2,
y cero si son iguales.

27
Ejemplo de Comparator

28
TestComparator.java

29
The area of the larger object is 78.53981633974483
Métodos Static para Lists y
Collections
La clase Colecciones contiene métodos
estáticos para realizar operaciones comunes
en colecciones y listas.

30
Collections

31
Interfaz Comparable

• Puede ordenar los elementos comparables en una lista


en su orden natural con el método compareTo en la
interfaz Comparable. También puede especificar un
comparador para ordenar los elementos.
• Por ejemplo, el siguiente código ordena cadenas en
una lista.
List<String> list = ArraysList("red", "green", "blue");
Collections.sort(list);
System.out.println(list);

La salida es [blue, green, red].

32
Clase Vector y Stack
• Vector es una subclass de AbstractList, y Stack es una subclass
de Vector en el API de Java.

• Vector es lo mismo que ArrayList, excepto que contiene


métodos sincronizados para acceder y modificar el vector.
• Los métodos sincronizados pueden evitar la corrupción de datos
cuando se accede y modifica un vector por dos o más hilos al
mismo tiempo

• Para los muchas aplicaciones que no requieren sincronización, el


uso de ArrayList es más eficiente que usando Vector.

• La clase Vector extiende la clase AbstractList

33
Clase Vector

34
Clase Stack
◼ En el Framework de Java Collections, Stack es
implementado como una extension de Vector

35
La Interface Queue

36
Deque y LinkedList
◼ La clase LinkedList implementa la interfaz Deque, que amplía la
interfaz Queue, por lo tanto, puede usar LinkedList para crear
una cola.
◼ LinkedList es ideal para operaciones de cola porque es eficiente
para insertar y eliminar elementos de ambos extremos de una
lista.
◼ Deque admite la inserción y eliminación de elementos en
ambos extremos. El nombre deque es la abreviatura de
◼ "Cola de dos extremos“.
◼ La interfaz de Deque se extiende a Cola con métodos
adicionales para insertar y eliminar elementos de ambos
extremos de la cola. Los métodos addFirst (e), removeFirst (),
addLast (e), removeLast (), getFirst (), y getLast () se definen en
la interfaz Deque.
37
LinkedList implements List y Deque.

38
TestQueue.java

39
PriorityQueue

40
PriorityQueueDemo.java

41
PriorityQueueDemo.java

42

También podría gustarte