El otro día veíamos cómo ordenar un vector de string con Java. Si bien, teníamos como limitante que el método sort de Collections realizaba una ordenación atendiendo a los caracteres ASCII.
Mediante este ejemplo veremos cómo ordenar un Vector de forma alfabética con Java. Para ello nos aprovecharemos de que el método sort tiene dos formas de llamarse.
En la primera, y ya utilizada, se le pasa la lista que contiene los elementos a ordenar:
public static > void sort(List list)
En la segunda, a parte de la lista de elementos, se le puede pasar una clase que sepa como ordenar dichos elementos y que por lo tanto los ordene a nuestro gusto. Atendiendo a nuestro ejemplo que los ordene de forma alfabética.
public static void sort(List list, Comparator super T> c)
La clase que tiene la lógica de ordenación será una clase del tipo Comparator. Y es que Comparator es un interface a implementar por la clase que contenga la ordenación.
El interface Comparator define dos métodos. Uno de los cuales es .compare(), el cual recibe dos objetos de la lista y decide cual es mayor de los dos.
Definamos nuestra clase de comparación:
class Comparador implements Comparator {
public int compare(String s1, String s2) {...}
}
Como estamos ordenando un Vector de String, la clase que le pasamos al Template será String.
Volviendo al método .compare(), este deberá de devolver un valor negativo, cero o positivo. Atendiendo a las siguientes reglas:
- negativo, si el primer argumento es más pequeño que el segundo.
- cero, si los dos elementos son iguales.
- positivo, si el primer elemento es más grande que el segundo.
Como a nosotros nos interesa realizar una ordenación alfabética que no identifique mayúsculas y minúsculas, lo primero que haremos será convertir las dos cadenas a minúsculas mediante el método .toLoweCase().
s1.toLowerCase();
Y posteriormente utilizaremos el método .CompareTo de la clase String, el cual tiene el mismo comportamiento que el definido anteriormente para el método compare().
Así el código nos quedará de la siguiente forma:
class Comparador implements Comparator {
public int compare(String s1, String s2)
{
return s1.toLowerCase().compareTo(s2.toLowerCase());
}
}
Ahora solo nos quedará llamar desde la clase que realiza la ordenación al método sort, pasándolo el Vector y la clase que hace la comparación:
Vector miVector = new Vector();
miVector.add("Victor");
miVector.add("julio");
miVector.add("amaya");
Collections.sort(miVector,new Comparador());