Classificação com Comparable e Comparator em Java

Neste post vou explicar como fazer a classificação de objetos usando as interfaces Comparable e Comparator, mostrando as diferenças entre os dois contratos.

Para classificar objetos precisamos compará-los com outros. Precisamos de alguns critérios para fazer essa comparação, pois o método equals() nos informa se um objeto é igual a outro, mas não consegue nos dar a resposta se um objeto é maior ou menor do que outro.

Interface java.lang.Comparable

Vamos analisar o seguinte código:

Criamos uma classe para testar o código:

Percebam que o Eclipse acusou um erro, portanto não teremos sucesso ao compilar esta classe.
Veremos outro exemplo antes da explicação.

Fiz um pequeno teste de ordenação com Strings e tivemos sucesso na compilação. E por quê o nosso exemplo anterior nem compilou?
A resposta é que o método estático sort() só com consegue classificar objetos Comparable, e a classe String implementa a interface Comparable. Vamos consultar a API:

Então se o nosso objeto do tipo Carro implementar a interface Comparable, teremos sucesso na classificação.

Implementando a interface Comparable

O método compareTo() deverá ser implementado. Ele retorna:

  • Um inteiro menor que zero se objeto atual for “menor” que o recebido como parâmetro
  • Um inteiro maior que zero se objeto atual for “maior” que o recebido como parâmetro
  • Zero se objetos forem iguais

Vamos analisar a nossa classe alterada:

Neste ponto aquele aviso vermelho na classe TesteCarro.java já deve haver sumido. Vamos rodar pra ver o resultado:

Como resultado temos a lista de Carros ordenada como queríamos.

Quando fazemos uma classe implementar a interface Comparable, precisamos seguir o seu contrato, isto é, temos que implementar seu método compareTo(), escolhendo um critério para a classificação. No exemplo da classe Carro usamos a marca do carro como classificação, poderíamos haver escolhido o atributo ano como critério de classificação. Ficaria assim:

Hora da pergunta

Agora é a hora da seguinte pergunta:

“Serjaum, e se eu quiser que na minha classe tenha um compareTo() pra fazer a classificação usando como critério a marca e na mesma classe eu tenha outro compareTo() usando ano?”

Resposta: Você pode implementar o método compareTo() somente uma vez. A maneira de usar mais de um critério de classificação vem logo em seguida…

Interface java.util.Comparator

A interface Comparator nos permite que façamos classificações de várias maneiras distintas, e o mais importante, sem haver a necessidade de alteração da nossa classe. Podemos até classificar classes que não podem ser modificadas.
Vamos analisar o nosso exemplo Carro novamente:

Agora vamos criar uma classe para fazer a classificação usando como critério a marca do carro:

E outra classe para fazer a classificação usando como critério o ano do carro:

Teste marca

A diferença é que temos que instanciar a classe que irá fazer a classificação, no caso a classe OrdenaMarca. Depois, temos que passar a instância para o método sort().

Teste ano

Mesma explicação, o qual foi feita no teste marca, mas usando a classe OrdenaAno.

Até o próximo post!


13 Comentários on “Classificação com Comparable e Comparator em Java”

  1. S7r0w disse:

    Muito bom mesmo esse post. Tirou todas as minhas dúvidas sobre comparable e comparator. Valeu!

  2. Adailson Filho disse:

    Cara, e se eu quiser um metodo generico que compare tanto strings quanto inteiros para um objeto generico?

  3. Lucas Polo disse:

    Dica muito boa, simples e direta. Apesar de simples, as collections possuem muitos detalhes que fazem muita diferença.

  4. Rodrigo disse:

    Ótimo artigo, simples e direto!

  5. Parabéns pelo artigo. Vou usá-lo nos meus treinamentos, ok??? Não foi esquecer de mencionar a fonte… :)) Abraço

  6. Raiane disse:

    Nossa você não noção da ajuda que você me deu!!!
    Muitooooooooo Obrigada! =)

  7. renan passos disse:

    Parabéns pelo artigo. Muito bom!

  8. riger disse:

    Cara procurei bastante um Post, sobre comparable em java… não encontrei nenhum melhor q o seu, PARABÉNS.

  9. WelWel disse:

    Toda vez que esqueço a sintaxe e diferença dos dois acabo visitando sempre este post.
    Muito bom, auto explicativo e com exemplos simples.
    Parabéns!!!


Deixe uma resposta

Preencha os seus dados abaixo ou clique em um ícone para log in:

Logotipo do WordPress.com

Você está comentando utilizando sua conta WordPress.com. Sair / Alterar )

Imagem do Twitter

Você está comentando utilizando sua conta Twitter. Sair / Alterar )

Foto do Facebook

Você está comentando utilizando sua conta Facebook. Sair / Alterar )

Foto do Google+

Você está comentando utilizando sua conta Google+. Sair / Alterar )

Conectando a %s