Documentos de Académico
Documentos de Profesional
Documentos de Cultura
Ya hemos visto en la clase anterior sobre los wrappers, que son, digamos, las
clases que absorben a los elementos primitivos, a los tipos de dato primitivo.
Y ahora vamos a volver ya a lo que es nuestro paquete Java.util propiamente
dicho, ya con nuestras listas. ¿Qué más vamos a hacer con las listas ahora?
A ver, sabemos ya que dado que la lista a veces nosotros vamos agregando los
elementos conforme van llegando, no siempre van a estar en orden, entonces
lo primero que tendremos que hacer es qué sucedería si a mí me piden ordenar
una lista. ¿De qué forma puedo ordenarla?
La azul
¿Por qué? Porque es esa clase collections, muy diferente de la interfaz, ojo,
tienes la interfaz collection y la clase collections, con S. La clase collections
tenía un método que era para ordenar las listas, que el método sort. ¿Pero cuál
es el problema ahí?
[04:00] Que ya que Java es un lenguaje orientado a objetos, entonces no sería
lo más ideal que la lista tenga su propio método para ordenarse y no depender
de un objeto externo. Entonces tenemos esas dos formas, vamos a explorar la
primera, vamos a ponerle un lista, aquí un punto y vamos a escribir sort.
¿pero qué tipo de variable es? El tipo de variable que espera es cualquier cosa
que extienda de cuenta.
Vemos que claro, me abre un generic aquí. Vamos a entrar a comparator para
explorarlo más. Vemos aquí que él tiene primero una notación
FunctionalIinterface que lo vamos a ver un poco más adelante. No va a
importar por ahora. Y tiene un comparator con un generic. ¿Qué significa eso?
Él va a aceptar una clase como parámetro para poder comparar.
vamos a explorar un poco aquí, de qué se trata este compare. Borramos esto.
¿Cómo podemos comprobar que está bien, que el código funciona? Vamos a
hacer algo
Funiona
Usando Wrappers
Porque me dice que string tiene un método que se llama compareTo ¿y qué
recibe como parámetro compareTo. Otro string. Y entonces le digo "Okay,
vamos a implementarlo".
[03:55] Porque al igual que en nuestro método anterior, que usamos para
ordenar por número de cuenta, el también va a retornar o1, -1 o 0,
dependiendo del orden que salga de aquí.
Y yo, tranquilamente, podría hacer esto de aquí. Voy a borrar este return de
aquí y voy a retornar directamente este método de aquí. CompareTo, titular y
nombre, perfecto.
¿Por qué? Porque internamente, miren, la clase string ya va a hacer por mí ese
trabajo de obtener el primer carácter, compararlo con otro y retornar un
entero. Entonces, listo,
¿Qué vamos a hacer ahora? Vamos a darle, otra vez vamos a crear un
comparator de cuenta.
Pero aquí vemos que no sé si lo ordenó de verdad por nombre de titular o no,
porque yo no estoy imprimiendo el nombre de titular, así que solamente para
estar seguro voy a entrar aquí a cuenta.
Esto es igual
A esto.
Y si ustedes se han dado cuenta y han sido un poco curiosos, ya que el método
compareTo recibes solamente estos dos parámetros. Perdón, recibe este
parámetro pero es basado en esta clase de aquí, ¿será que no puedo hacer algo
parecido aquí? Porque si se dan cuenta, si el número de cuenta es igual al otro,
perfecto, retorno ese, si éste es mayor retorno 1, si no menos 1.
[07:11] Pero esto sería igual, esto sería exactamente igual a decirle que retorne
esto de aquí.
Orden Natural’
Entonces si yo sé que recibo una implementación de la interfaz directamente
aquí, yo podría hacerlo también de la siguiente forma. Miren lo que yo tengo
aquí.
Entonces esa es una de las ventajas que me permite aquí el aceptar una
interfaz funcional, recuerden aquí esta anotación, FunctionalInterface es
implementar una interfaz funcional aquí a mi método. ¿Por qué es interfaz
funcional?
ya tenemos aquí nuestra lista y nuestro algoritmo para ordenarla. En este caso
es la implementación de nuestro comparator. Vamos a ver si funciona.
Vemos que lo ordenó. Pero les dije que ese era un método sobrecargado. ¿Por
qué? Y aquí es donde entra lo interesante.
Y vemos que compila nivel de parámetros, pero el sort no está compilando y
aquí entra una pregunta: ¿ustedes cómo creen que el método sort puede
saber, por qué ordenarlos? Si yo aquí le digo: "Collections, ordéname está
lista".
Ahora, ¿mi orden natural en dónde debería estar definido? ¿En la lista o
en la cuenta, que es lo que voy a ordenar? Así es, en la cuenta. Porque yo
voy a ordenar cuentas dentro de esa lista, entonces lo que voy a hacer aquí es
entrar a mi clase cuenta. Y aquí existe otra interfaz que yo puedo implementar
aquí. Y esa interfaz se llama Comparable, también de Java.lang.
[06:46] Entonces en esta versión de aquí, en la 1.02 que salió esta interfaz, no
existía esa anotación. Lo más probable es que quizá más adelante sea
deprecada, pero hasta el momento es muy, muy utilizada y van a ver por qué.
Porque aquí en mi clase cuenta, ya que tengo mi método compareTo,
supongamos que ahora yo voy a ordenarlo por defecto. Orden natural por
Número de Agencia.
Qué
debería de hacer yo? Aquí tranquilamente, podría hacerlo de cualquiera de
estas tres formas. Es exactamente lo mismo. Es la misma implementación, la
misma lógica, puedo hacerlo con los ifs, puedo hacerlo con la resta o
directamente con el wrapper.
[10:40] Las dudas que tengan pueden ponerlas aquí en el foro y recuerden
siempre: esta es la forma antigua de ordenar, vamos a dejarlo aquí en claro:
forma antigua. Y esta es la forma normal, digamos que se usa ahora, pero
recuerden desde Java 8. Y bueno, aquí tenemos ya cómo ordenar las cuentas.
Desde java 8 es esta
¿Será que son las únicas formas que existen de implementar estos algoritmos
o interfaces para ordenar listas? No. No son las únicas, y en la próxima clase
vamos a ver ya las tan esperadas lambdas.
Extras
Desafío de Collections