Ordenar listas alfabéticamente en Java
En esta entrada vamos a explorar diferentes maneras de ordenar listas alfabéticamente en Java. Para a realizar diferentes aproximaciones de ordenación, haciendo uso de Streams, de Collection de Java, de TreeSet, comparator o haciendo uso de la funcionalidad RuleBasedCollator.
Ordenar listas alfabéticamente con Streams en Java
Con la llegada de Java 8, aparecieron los Streams en Java, vamos a ver como podemos ordenar listas alfabéticamente en Java haciendo uso de streams.
Para realizar la ordenación con Stream hacemos uso de sorted, el cual devuelve un Stream de Strings.
Ordenación alfabética Natural
En el siguiente ejemplo hacemos uso de sorted(), para obtener una ordenación natural. Vamos a verlo en el siguiente test:
@Test void given_name_list_when_sort_then_return_a_list_sorted() { List<String> names = List.of("Pepe","Pablo","Noel","Susan","John","Aman"); List<String> sortedNames = names.stream() .sorted() .collect(Collectors.toList()); List<String> expectedNames = List.of("Aman","John","Noel","Pablo","Pepe","Susan"); assertThat(sortedNames).isEqualTo(expectedNames); }
Ordenación alfabética Inversa
Para realizar una ordenación en orden inverso, podemos hacer uso del método reverseOrder de Comparator, o utilizar una función lambda.
@Test void given_name_list_when_reverse_sort_then_return_a_list_sorted() { List<String> names = List.of("Pepe","Pablo","Noel","Susan","John","Aman"); List<String> sortedNames = names.stream() .sorted(Comparator.reverseOrder()) .collect(Collectors.toList()); List<String> expectedNames = List.of("Susan","Pepe", "Pablo", "Noel", "John", "Aman"); assertThat(sortedNames).isEqualTo(expectedNames); }
Ordenación alfabética con Collection
Collection de Java nos proporciona el método Sort para realizar ordenaciones naturales, y Comparator para realizar ordenaciones inversas.
Ordenación natural con Collection en Java
Sort puede ser utilizada en cualquier Collection y lo que hace es devolver la lista totalmente ordenada. Sino se aplica ningún comparador la lista es ordenada en orden Natural A..Z.
Vamos a ver como aplicar Sort() en collections de Java.
@Test void given_name_list_when_sort_then_return_a_list_sorted() { List<String> names = List.of("Pepe","Pablo","Noel","Susan","John","Aman"); Collections.sort(names); List<String> expectedNames = List.of("Aman","John","Noel","Pablo","Pepe","Susan"); assertThat(sortedNames).isEqualTo(expectedNames); }
Ordenación Inversa con Collection en Java
Vamos a realizar una ordenación inversa haciendo uso de Comparator. Al ser una interfaz funcional puede ser utilizada en una expresión Lambda.
@Test void given_name_list_when_reverse_sort_then_return_a_list_sorted() { List<String> names = List.of("Pepe","Pablo","Noel","Susan","John","Aman"); Collections.sort(names, Comparator.reverseOrder()); List<String> expectedNames = List.of("Susan","Pepe", "Pablo", "Noel", "John", "Aman"); assertThat(sortedNames).isEqualTo(expectedNames); }
Ordenación Natural en Lists en Java
Las listas en Java tienen su propio método Sort de Ordenación, en lugar de hacer uso de Collection.sort, podemos hacer uso del método List.sort().
@Test void given_name_list_when_sort_then_return_a_list_sorted() { List<String> names = List.of("Pepe","Pablo","Noel","Susan","John","Aman"); names.sort(); List<String> expectedNames = List.of("Aman","John","Noel","Pablo","Pepe","Susan"); assertThat(sortedNames).isEqualTo(expectedNames); }
Ordenación Inversa con List en Java
@Test void given_name_list_when_inverse_sort_then_return_a_list_sorted() { List<String> names = List.of("Pepe","Pablo","Noel","Susan","John","Aman"); names.sort(Comparator.reverseOrder()); List<String> expectedNames = List.of("Susan","Pepe", "Pablo", "Noel", "John", "Aman"); assertThat(sortedNames).isEqualTo(expectedNames); }
Realizar ordenación en Java con Rule-Based Collator
Cuando hacemos uso de la clase RuleBasedCollator, podemos definir una serie de pasos o pautas para definir un orden en una lista.
Vamos a ver un ejemplo en el que hacemos uso de una regla para crear una nueva ordenación:
@Test void given_name_list_when_request_to_sort_with_rule_based_collector_then_list_is_returned() throws ParseException { List<String> names = Arrays.asList( "Pepe","Pablo","Noel","Susan","John","Aman"); Collections.sort(names); List<String> namesOrderExpected = Arrays.asList( "Aman","John","Noel","Pablo","Pepe","Susan"); assertThat(names).isEqualTo(namesOrderExpected); List<String> rulesBasedExpected = Arrays.asList( "Noel","Pablo","Pepe","Susan","Aman","John"); String rule = "< n, N < P, S < a, A < j, J"; RuleBasedCollator rulesCollator = new RuleBasedCollator(rule); names.sort(rulesCollator); assertThat(names).isEqualTo(rulesBasedExpected); }
En el ejemplo anterior hemos alterado el orden lógico a través del uso del objeto RuleBasedCollector, en el que hemos establecido el orden: «< n, N < P, S < a, A < j, J»;
Ordenación en Java con TreeSet
No es muy común hacer uso de TreeSet, pero el uso de esta clase nos va a permitir realizar ordenaciones alfabéticas en Java.
TreeSet nos permite ordenaciones alfabéticas de manera natural y en orden inverso. La única condición es no tener elementos repetidos ya que estos nos los conservará.
@Test void given_name_list_when_sort_then_return_a_list_sorted() { List<String> names = List.of("Pepe","Pablo","Noel","Susan","John","Aman"); SortedSet<String> sortedTreeSet = new TreeSet<>(names); List<String> sortedList = new ArrayList<>(sortedTreeSet); List<String> expectedNames = List.of("Aman","John","Noel","Pablo","Pepe","Susan"); assertThat(sortedNames).isEqualTo(expectedNames); }
Conclusión
En esta entrada sobre Ordenar listas alfabéticamente en Java hemos visto las diferentes aproximaciones que tenemos para realizar una ordenación de una lista.
Si necesitas más información puedes escribirnos un comentario o un correo electrónico a refactorizando.web@gmail.com o también nos puedes contactar por nuestras redes sociales Facebook o twitter y te ayudaremos encantados!