cami-la / collections-java-api-2023

Este repositório é referente ao curso "Collection Framework API Java" e é uma valiosa contribuição para a comunidade de desenvolvedores Java, fornecendo exemplos práticos e recursos educacionais relacionados à poderosa API de coleções da linguagem Java.
https://web.dio.me/course/conhecendo-collections-java/learning/c5d6f4e1-6d05-4eea-93d8-d292c708999f
876 stars 636 forks source link

Uso das interfaces Comparable e Comparator #11

Open eltosilva opened 11 months ago

eltosilva commented 11 months ago

Você cometeu um equivoco no README em relação ao uso da interface Comparable, ao dizer que na implementação da interface so se pode usar um atributo da classe. Ao implementar a interface Comparable posso usar mais de um atributo da classe para ordenação, tudo vai depende dos requisitos da classe. Exemplo: Em um sistema para uma concessionária, no requisito do sistema foi definido a class Carro { private String marca; private String modelo; private int ano; }, e que ordenação padrão (natural) da mesma é pela marca, modelo e ano (nessa ordem). Então posso implementa-lá da seguinte forma:

public class Carro implements Comparable<Carro>{
  private String marca; 
  private String modelo;  
  private int ano;

  public int compareTo(Carro c) {

    int compare = marca.compareTo(c.marca);
    if(compare == 0) {
      compare = modelo.compareTo(c.modelo);
      if(compare == 0) {
        int dif = ano - c.ano;
        if(dif == 0)
          return 0;

        compare = dif / Math.abs(dif);
      }
    }

    return compare;
  }
}
cami-la commented 11 months ago

Oi, amigo. Bom dia, tudo certinho?

Então, acredito que houve uma confusão no entendimento sobre a interface Comparable.

Comparable fornece uma única sequência de ordenação. Em outras palavras, podemos ordenar a coleção com base em um único elemento, como id, nome e preço.
Aqui eu estou fazendo uma comparação entre os situações de uso para se utilizar o Comparable X Comparator.

O uso de Comparable é ideal quando você deseja definir uma ordem natural para uma classe e essa ordem não muda frequentemente. Já o, o Comparator é mais apropriado quando você deseja ter flexibilidade para definir diferentes ordens de classificação ou quando não pode modificar a classe existente (por exemplo, classes de bibliotecas externas).

Embora a implementação que você forneceu usando a interface Comparable esteja correta, ela pode se tornar complexa e difícil de manter à medida que os critérios de ordenação aumentam ou mudam. Nesses casos, é uma boa prática usar um Comparator em vez de modificar a classe em si.

Inclusive, quando você utiliza do Stream API, é utilizado de forma extensiva a interface Comparator.

https://pt.stackoverflow.com/questions/342237/diferen%C3%A7a-entre-comparator-e-comparable