Eu já vi classes que implementam o Comparable e o Comparator . O que isto significa? Por que eu usaria um sobre o outro?
Eu já vi classes que implementam o Comparable e o Comparator . O que isto significa? Por que eu usaria um sobre o outro?
Respostas:
O texto abaixo é de Comparador x Comparável
Comparável
Um objeto comparável é capaz de se comparar com outro objeto. A própria classe deve implementar a java.lang.Comparableinterface para poder comparar suas instâncias.
Comparador
Um objeto comparador é capaz de comparar dois objetos diferentes. A classe não está comparando suas instâncias, mas algumas instâncias de outras classes. Essa classe comparadora deve implementar a java.util.Comparatorinterface.
Implementar Comparablesignifica " Eu posso me comparar com outro objeto " . Isso geralmente é útil quando há uma única comparação padrão natural.
Implementar Comparatorsignifica " Eu posso comparar dois outros objetos " . Isso geralmente é útil quando existem várias maneiras de comparar duas instâncias de um tipo - por exemplo, você pode comparar pessoas por idade, nome etc.
Personimplementando Comparable, porque não pode mudar como duas pessoas são comparadas.
Person. 2) O comparador, por exemplo, PersonAgeComparatorque é capaz de comparar duas entidades diferentes e decidir quais devem vir em primeiro lugar nessa ordem de classificação específica. 3) O código de classificação, que pega uma coleção de entidades e um comparador e classifica essa coleção usando o comparador para determinar a ordem.
Comparable permite que uma classe implemente sua própria comparação:
Por comparação, o Comparator é uma comparação externa:
Nas duas implementações, você ainda pode escolher o que deseja comparar . Com os genéricos, você pode declarar isso e verificá-lo no momento da compilação. Isso melhora a segurança, mas também é um desafio determinar o valor apropriado.
Como orientação, geralmente uso a classe ou interface mais geral com a qual esse objeto pode ser comparado, em todos os casos de uso que imagino ... Uma definição não muito precisa! :-(
Comparable<Object>permite usá-lo em todos os códigos em tempo de compilação (o que é bom, se necessário, ou ruim, se não, e você perde o erro em tempo de compilação); sua implementação precisa lidar com objetos e transmitir conforme necessário, mas de maneira robusta.Comparable<Itself> é muito rigoroso, pelo contrário.Engraçado, quando você se subclassifica em subclasse, a subclasse também deve ser comparável e ser robusta quanto a isso (ou isso violaria o princípio de Liskov e causaria erros de tempo de execução).
java.lang.Comparable
Para implementar a Comparableinterface, a classe deve implementar um único métodocompareTo()
int a.compareTo(b)
Você deve modificar a classe cuja instância você deseja classificar. Para que apenas uma sequência de classificação possa ser criada por classe.
java.util.Comparator
Para implementar a interface Comparator, a classe deve implementar um único método compare()
int compare (a,b)
Comparableé geralmente preferido. Mas, às vezes, uma classe já é implementada Comparable, mas você deseja classificar em uma propriedade diferente. Então você é forçado a usar um Comparator.
Algumas classes realmente fornecem Comparatorscasos comuns; por exemplo, Strings diferenciam maiúsculas de minúsculas quando classificados, mas também há uma estática Comparatorchamada CASE_INSENSITIVE_ORDER.
Aqui estão algumas diferenças entre o comparador e o comparável que encontrei na web:
Se você perceber que a diferença lógica entre esses dois é o Comparator em Java, compare dois objetos fornecidos a ele, enquanto a interface Comparable compara a referência "this" com o objeto especificado.
Comparável em Java é usado para implementar a ordenação natural do objeto. Na Java API String, as classes Date e wrapper implementam a interface Comparable.
Se alguma classe implementar a interface Comparable em Java, a coleção desse objeto List ou Array poderá ser classificada automaticamente usando o método Collections.sort () ou Array.sort () e o objeto será classificado com base na ordem natural definida pelo método CompareTo.
Objetos que implementam Comparable em Java podem ser usados como chaves em um mapa classificado ou em elementos em um conjunto classificado, por exemplo, TreeSet, sem especificar nenhum Comparador.
site: Como usar o Comparator e o Comparable em Java? Com exemplo
Leia mais: Como usar o Comparator e o Comparable em Java? Com exemplo
Comparableé para objetos com uma ordem natural. O próprio objeto sabe como deve ser pedido.
Comparatoré para objetos sem uma ordem natural ou quando você deseja usar uma ordem diferente.
Diferença entre as interfaces Comparador e Comparável
Comparable é usado para se comparar usando outro objeto.
Comparator é usado para comparar dois tipos de dados são objetos.
Se você perceber que a diferença lógica entre esses dois está Comparatorem Java, compare dois objetos fornecidos a ele, enquanto a Comparableinterface compara a referência "this" com o objeto especificado.
Comparableem Java é usado para implementar a ordenação natural do objeto. Na Java API String, as classes Date e wrapper implementam a Comparableinterface.
Se alguma classe implementar Comparableinterface em Java, a coleção desse objeto será Listou Arraypoderá ser classificada automaticamente usando o método Collections.sort()ou Array.sort(), e o objeto será classificado com base na ordem natural definida pelo compareTométodo.
Objetos implementados Comparableem Java podem ser usados como chaves em um mapa classificado ou elementos em um conjunto classificado, por exemplo TreeSet, sem especificar nenhum Comparator.
Minha anotação lib para implementar Comparable e Comparator:
public class Person implements Comparable<Person> {
private String firstName;
private String lastName;
private int age;
private char gentle;
@Override
@CompaProperties({ @CompaProperty(property = "lastName"),
@CompaProperty(property = "age", order = Order.DSC) })
public int compareTo(Person person) {
return Compamatic.doComparasion(this, person);
}
}
Clique no link para ver mais exemplos. compamatic