Ordenar listas alfabéticamente en Java

orden de listas alfabético en Java

orden de listas alfabético 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!


Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *