Tenho uma lista de objetos que preciso classificar em um campo, digamos Pontuação. Sem pensar muito, escrevi uma nova classe que implementa Comparator, que faz a tarefa e funciona.
Agora, olhando para trás, estou me perguntando se eu deveria ter feito minha classe implementar Comparable em vez de criar uma nova classe que implementasse Comparator. A pontuação é o único campo em que os objetos serão ordenados.
O que fiz é aceitável como prática?
A abordagem certa é "Primeiro, faça com que a classe implemente Comparable (para a ordem natural) e, se uma comparação de campo alternativa for necessária, crie uma nova classe que implemente Comparator"?
Se (2) acima for verdadeiro, então isso significa que se deve implementar Comparator apenas depois de ter a classe implementar Comparable? (Supondo que eu possua a classe original).
fonte
Usar
Comparable
se quiser definir um padrão comportamento de ordenação (natural) do objeto em questão, uma prática comum é usar um identificador técnico ou natural (banco de dados?) Do objeto para isso.Use
Comparator
se quiser definir um comportamento de pedido externo controlável ; isso pode substituir o comportamento de pedido padrão.fonte
Comparable
significa que estou definindo a ordem natural?" , isso me deu a resposta que eu procurava. Obrigado :)Use
Comparable
:Use
Comparator
:Comparable
.Comparable
).fonte
Comparável -
java.lang.Comparable: int compareTo(Object o1)
Um objeto comparável é capaz de se comparar a outro objeto. A própria classe deve implementar a interface java.lang.Comparable para poder comparar suas instâncias.
only one sort sequence
base nas propriedades das instâncias. EX:Person.id
Comparador -
java.util.Comparator: int compare(Object o1, Object o2)
Um objeto comparador é capaz de comparar dois objetos diferentes. A classe não está comparando suas instâncias, mas as instâncias de algumas outras classes. Esta classe comparadora deve implementar a interface java.util.Comparator.
many sort sequence
e nomear cada um, com base nas propriedades das instâncias. EX:Person.id, Person.name, Person.age
Exemplo:
Para Java 8 Lambda: Comparator consulte meu post.
fonte
Comparable deve ser usado quando você compara instâncias da mesma classe.
Comparator pode ser usado para comparar instâncias de classes diferentes.
Comparable é implementado por classes que precisam definir uma ordem natural para seus objetos. Como String implementa Comparable.
No caso de alguém desejar uma ordem de classificação diferente, ele pode implementar o comparador e definir sua própria maneira de comparar duas instâncias.
fonte
Se a classificação de objetos precisar ser baseada na ordem natural, use Comparable, enquanto se a classificação precisar ser feita em atributos de objetos diferentes, use Comparator em Java.
Principais diferenças entre Comparável e Comparador:
fonte
O Comparator faz tudo o que o comparador faz e muito mais.
Achei a melhor abordagem para usar comparadores como classes anônimas da seguinte maneira:
Você pode criar várias versões de tais métodos dentro da classe que está planejando classificar. Então você pode ter:
sortAccountsByPriorityAndType
etc ...
Agora, você pode usar esses métodos de classificação em qualquer lugar e obter a reutilização do código. Isso me dá tudo o que um comparável teria, e mais ... então não vejo nenhuma razão para usar comparável.
fonte
Eu diria:
fonte
Os pontos a seguir o ajudam a decidir em quais situações se deve usar Comparable e em qual Comparator:
1) Disponibilidade do código
2) Critérios de classificação único versus múltiplo
3) Arays.sort () e Collection.sort ()
4) Como chaves em SortedMap e SortedSet
5) Mais número de classes versus flexibilidade
6) Comparações entre classes
7) Ordem Natural
Para um artigo mais detalhado, você pode consultar Quando usar comparável e quando usar comparador
fonte
fonte
Se você precisar de classificação de ordem natural - Comparável com o usuário SE precisar de classificação de ordem personalizada - Use o comparador
Exemplo:
A ordenação por ordem natural seria baseada no id porque seria única e a ordenação por ordem personalizada seria o nome e o departamento.
Refrences:
Quando uma classe deve ser comparável e / ou comparadora? http://javarevisited.blogspot.com/2011/06/comparator-and-comparable-in-java.html
fonte
Houve uma pergunta semelhante aqui: Quando uma classe deve ser comparável e / ou comparadora?
Eu diria o seguinte: Implemente comparável para algo como uma ordem natural, por exemplo, com base em um ID interno
Implemente um comparador se você tiver um algoritmo de comparação mais complexo, por exemplo, campos múltiplos e assim por diante.
fonte
Comparable
.Comparável:
sempre que quisermos armazenar apenas elementos homogêneos e a ordem de classificação natural padrão necessária, podemos ir para a implementação de classe
comparable
interface de .Comparador:
Sempre que quisermos armazenar elementos homogêneos e heterogêneos e quisermos classificar na ordem de classificação personalizada padrão, podemos ir para a
comparator
interface.fonte
Minha necessidade era classificar com base na data.
Então, usei o Comparable e funcionou facilmente para mim.
Uma restrição com Comparable é que eles não podem ser usados para Coleções que não sejam List.
fonte
Se você possui a classe, é melhor ir com Comparable . Geralmente Comparador é usado se você não possuir a classe, mas você tem que usá-lo uma TreeSet ou TreeMap porque Comparador pode ser passado como um parâmetro no conctructor de TreeSet ou TreeMap. Você pode ver como usar Comparator e Comparable em http://preciselyconcise.com/java/collections/g_comparator.php
fonte
Fui questionado sobre a classificação de um intervalo definido de números em tempo melhor do que o normal em uma das entrevistas. (Não usa classificação por contagem)
A implementação da interface Comparable sobre um objeto permite que os algoritmos de classificação implícitos usem o método compareTo substituído para ordenar os elementos de classificação e isso seria o tempo linear.
fonte
Comparable é a ordem de classificação natural padrão fornecida para valores numéricos em ordem crescente e para strings em ordem alfabética. por exemplo:
Comparator é a ordem de classificação personalizada implementada na classe myComparator personalizada, substituindo um método de comparação por exemplo:
fonte
Uma abordagem muito simples é assumir que a classe de entidade em questão seja representada no banco de dados e, em seguida, na tabela do banco de dados, você precisaria de um índice composto de campos da classe de entidade? Se a resposta for sim, implemente comparável e use o (s) campo (s) de índice para ordenação natural. Em todos os outros casos, use comparador.
fonte
Minha biblioteca de anotações para implementação
Comparable
eComparator
:Clique no link para ver mais exemplos. http://code.google.com/p/compamatic/wiki/CompamaticByExamples
fonte