Listas Ordenamiento
Listas Ordenamiento
ListADT
Tipos de listas:
● Ordenada: ordenadas por un valor especifico (ej alfabeticamente)
● Desordenada: los elementos no tienen orden inherente más que su lugar en la lista.
Aunque aparentemente carezcan de orden, este puede ser determinado por el usuario.
La lista mantiene sus índices contiguos, es decir si un elemento es removido, la lista se colapsa
para eliminar el espacio. De la misma forma cuando un elemento es insertado los otros
elementos son movidos para crear espacio.
A diferencia de la una cola o una fila, en las que solo se puede acceder al primer o último
elemento de la colección, en las listas podemos acceder a cualquier elemento. Por esta razón
se necesita un iterador.
Un iterador es un objeto que permite iterar sobre una colección, es decir, repetir un proceso
para alcanzar una meta, cada proceso es denominado “iteración”, los resultados de una
iteración son el punto de partida de la siguiente.
Las colecciones en java tienen una forma de iterar sobre sus elementos, en el caso de las listas
el método regresa un objeto Iterator.
El método iterator de la interfaz ListADT regresa un objeto que implementa esta interfaz.
El orden que sigue el iterador para recorrer los elementos de una lista es lineal.
Tipos de iterador:
● Permiten modificación de la colección y reflejan los cambios mientras se itera
● Trabajan con una copia de la colección por lo que las modificaciones no tienen impacto.
Agregar elementos
Lista ordenada: agrega el elemento en una posición específica basado en su valor llave.
Lista desordenada: agrega el elemento al frente, inicio o entre dos elementos específicos.
Lista indexada: un elemento nuevo se agrega a un índice específico. El resto de los índices
deben ser modificados. Es posible que el elemento de un índice sea sobrescrito y no afecte el
resto de los índices.
Ya que los diferentes tipos de listas comparten la mayoría de sus métodos, dichos métodos
pueden definirse una sola vez. Por ello, se definirán 3 interfaces: una con los métodos comunes
y dos con los métodos propios.
ADT (Abstract Data Type)
Interfaces y Polimorfismo
Los tipos genéricos <T> se usan para guardar cualquier tipo de objeto en una colección.
Aunque en el caso de las colecciones ordenadas, se agrega una restricción, los objetos deben
implementar la clase Comparable. Esto es necesario para usar el método compareTo, que nos
permitirá ordenar los elementos en la lista.
Una clase es usada para declarar el tipo de objeto al que una variable hace referencia.
Similarmente, una interfaz es usada como la referencia de una variable. Dicha variable puede
usarse para referirse a cualquier objeto de cualquier clase que implemente esa interfaz.
Ej:
Interfaz Speaker:
Speaker current;
La variable de referencia puede usarse para referirse a cualquier objeto que implemente la
interfaz Speaker, por ejemplo la clase philosopher:
El usar interfaces hacemos referencias polimórficas, excepto que los objetos son relacionados
al implementar la misma interfaz en lugar de ser relacionados por herencia.
Por ejemplos al crear una clase Dog que implemente la interfaz Speaker tambien podria ser
asignada a una variable que referencie Speaker.
Speaker guest;
guest = new Philosopher();
guest.speak(); //invoca el método de philosopher
guest = new Dog();
guest.speak(); // invoca el método de Dog
Al referenciar interfaces solo se pueden invocar los métodos definidos en la interfaz. Por
ejemplo si la clase Philosopher tiene un método propio llamado escribir no podrá ser usado.
((Philosopher) special).pontificate();
Todos los elementos de una lista ordenada comparable pueden hacer referencia a una interfaz.
Esto significa que cualquier objeto de cualquier clase que implemente la interfaz Comparable
puede ser almacenado en instancias de una lista ordenada.
Sin embargo, solo tener objetos que implementen la interfaz Comparable no significa que
puedan ser comparados entre ellos, solo que puedes ser comparados objetos del mismo tipo.
La interfaz Comparable es es generica:
Esto sigue causando problemas. Por ejemplo, Dog y Philospher son subclases de Mammal y
esta a su vez implementa la interfaz Comparable<Mammal>. Esto significa que philosopher y
dog pueden ser comparados con otros mamíferos, no solo con los de su clase.
Usar <T extends Comparable<T>> no permitiria crear una lista ordenada de filosofos ya que
estos son comparables con otros mamíferos. La mejor solución es incluir el comparable de T y
de la superclase de T que implemente Comparable:
Cualquier evento deportivo suele ser organizado en una lista que indica el numero de victorias
por equipo. Una lista ordenada puede ayudarnos a almacenar y ordenar los equipos segun su
numero de victorias.
Al finalizar la primer ronda los equipos son organizados de tal forma que se enfrenta el primero
vs ultimo, segundo contra penultimo hasta que no queden mas equipos por enfrentar. PAra las
rondas siguientes los equipos organizados de acuerdo al numero de juego de la segunda
ronda.
Para implementar un programa llevar a cabo la primer ronda del torneo requiere antes que
anda crear la clase equipo.
Tambien requiere un metodo que compare a los equipos entre si. COMPARETO ().
Regresa -1 si el primer equipo tiene menos victorias que el segundo.
Regresa 0 si estan empatados
Regresa 1 Si el primer equipo tiene mas victorias que el segundo.