1
resposta

Collections Sort

No curso de Collections na aula 2, o grande Paulo Silveira nos ensina a fazer um Collections sort com dois objetos, ele mostra que devemos implementar a interface comparable e reescrever o metodo compareTo(). No primeiro caso estamos usando o método para comparar os titulos das aulas:

@Override
  public int compareTo(Aula outraAula) {
       return this.titulo.compareTo(outraAula.getTitulo());
   }

E fazemos então o sort:

Collections.sort(aulas);
// isso irá devolver a aulas em ordem alfabética

Ele nos dá também uma opção de fazer o sort com o tempo das aulas, sem precisar mudar o método compareTo() na nossa classe Aula. nos ensina assim:

Collections.sort(aulas, Comparator.comparing(Aula::getTempo));
// isso irá devolver as aulas em ordem de tempo

praticando, eu tentei fazer o sort com o titulo, sem implementar a interface comparable e o método compareTo(), usando só:

no main:
Collections.sort(aulas, Comparator.comparing(Aula::getTitulo));

E o resultado foi o esperado, aconteceu a ordenação em ordem alfabética de aulas, então no fim nem precisei implementar a interface, reescrever o método e essas coisas, oque eu fiz foi uma gambiarra ?é bom fazer isso ? ou Só se deve fazer isso se você já tem um método compareTo() e não quer mudar ele ?

1 resposta

Quando fiz foi um pouco diferente utilizei da seguinte forma

aulas.sort(Comparator.comparing(Aula::getTempo));

Mas explicando o motivo de funcionar é que o método Comparator. comparing recebe um Comparable e não somente a implementação de um Comparator.


   public static <T, U extends Comparable<? super U>> Comparator<T> comparing(
            Function<? super T, ? extends U> keyExtractor)
    {
        Objects.requireNonNull(keyExtractor);
        return (Comparator<T> & Serializable)
            (c1, c2) -> keyExtractor.apply(c1).compareTo(keyExtractor.apply(c2));
    }

Outro ponto importante que chama a atenção é olha o compareTo do Comparable.