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.Comparable
interface 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.Comparator
interface.
Implementar Comparable
significa " Eu posso me comparar com outro objeto " . Isso geralmente é útil quando há uma única comparação padrão natural.
Implementar Comparator
significa " 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.
Person
implementando Comparable
, porque não pode mudar como duas pessoas são comparadas.
Person
. 2) O comparador, por exemplo, PersonAgeComparator
que é 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 Comparable
interface, 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 Comparators
casos comuns; por exemplo, String
s diferenciam maiúsculas de minúsculas quando classificados, mas também há uma estática Comparator
chamada 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á Comparator
em Java, compare dois objetos fornecidos a ele, enquanto a Comparable
interface compara a referência "this" com o objeto especificado.
Comparable
em Java é usado para implementar a ordenação natural do objeto. Na Java API String, as classes Date e wrapper implementam a Comparable
interface.
Se alguma classe implementar Comparable
interface em Java, a coleção desse objeto será 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 compareTo
método.
Objetos implementados Comparable
em 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