Pergunta

Eu vi classes que implementam tanto Comparable e Comparator . O que isto significa? Por que eu iria usar um sobre o outro?

Foi útil?

Solução

O texto abaixo vem Comparador vs Comparable

Comparable

Um objecto comparável é capaz de comparar-se com um outro objecto. A classe em si deve implementa a interface java.lang.Comparable, a fim de ser capaz de comparar suas instâncias.

Comparator

Um objecto de comparação é capaz de comparar dois objectos diferentes. A classe não está comparando as suas instâncias, mas instâncias de alguma outra classe. Esta classe de comparação deve implementar a interface java.util.Comparator.

Outras dicas

A implementação de meios Comparable " eu posso me comparar com outro objeto. " Isto é tipicamente útil quando há uma única comparação padrão natural.

A implementação de meios Comparator " eu posso comparar dois outros objetos ." Isto é tipicamente útil quando existem várias maneiras de comparar duas instâncias de um tipo - por exemplo, Você poderia comparar as pessoas por idade, nome etc.

Comparável permite que uma classe implementar a sua própria comparação:

  • está em da mesma classe (muitas vezes é uma vantagem)
  • não pode ser apenas uma implementação (assim você não pode usar isso se você quiser dois casos diferentes)

Em comparação, a comparação é uma comparação externa:

  • é normalmente em uma instância única (seja na mesma classe ou em outro lugar)
  • você nome de cada implementação com a maneira que você quer resolver as coisas
  • você pode fornecer comparadores para classes que você não controla
  • a implementação é utilizável mesmo se o primeiro objeto é nulo

Em ambas as implementações, você ainda pode escolher o que você quer ser comparado . Com os genéricos, você pode declarar isso, e tê-lo verificado em tempo de compilação. Isso melhora a segurança, mas também é um desafio para determinar o valor apropriado.

Como orientação, eu geralmente uso da classe geral mais ou interface para que esse objeto poderia ser comparado, em todos os casos de uso Imagino ... Não muito preciso uma definição embora! : - (

  • Comparable<Object> permite usá-lo em todos os códigos em tempo de compilação (que é bom, se necessário, ou ruim, se não e você perder o erro em tempo de compilação); sua implementação tem de lidar com objetos e elenco como necessário, mas de uma forma robusta.
  • Comparable<Itself> é muito rigoroso, pelo contrário.

Engraçado, quando você subclasse-se a subclasse, subclasse também deve ser comparáveis ??e robusta sobre ele (ou ela iria quebrar Liskov Princípio, e dar-lhe tempo de execução erros).

java.lang.Comparable

  1. Para implementar a interface Comparable, classe deve implementar um método único compareTo()

    int a.compareTo(b)

  2. Você deve modificar a classe cuja instância que você deseja classificar. De modo que apenas uma sequência de ordenação pode ser criado por classe.

java.util.Comparator

  1. Para implementar a interface Comparator, classe deve implementar um método único compare()

    int compare (a,b)

  2. Você constrói uma classe separada da classe cujo exemplo você deseja classificar. Assim que a seqüência tipo múltipla pode ser criada por classe.

Comparable é para fornecer uma ordenação padrão em objetos de dados, por exemplo, se os objetos de dados tem uma ordem natural.

A Comparator representa a própria ordenação para um uso específico.

Comparable é geralmente preferido. Mas às vezes uma classe já implementa Comparable, mas você deseja classificar em uma propriedade diferente. Em seguida, você é forçado a usar um Comparator.

Algumas classes realmente fornecer Comparators para casos comuns; por exemplo, String s são por caso padrão sensível a quando ordenados, mas há também uma Comparator estática chamada CASE_INSENSITIVE_ORDER .

aqui estão algumas diferenças entre Comparador e eu Comparável encontrado na web:

  1. Se você vê diferença, então lógica entre estes dois é Comparador em Java comparar dois objetos fornecidos a ele, enquanto interface Comparable compara "isto" de referência com o objeto especificado.

  2. Comparável em Java é usado para implementar ordenação natural do objeto. Em Java API String, Data e classes de mensagens publicitárias implementar a interface Comparable.

  3. Se qualquer classe implementar a interface Comparable em Java, em seguida, coleção de esse objeto seja List ou Array pode ser resolvido automaticamente usando Collections.sort () ou Array.sort () e objeto serão classificados com base em não naturais ordem definida pelo método CompareTo.

  4. Objetos que implementam Comparável em Java podem ser usadas como chaves em um mapa ordenado ou elementos de um conjunto ordenado por exemplo TreeSet, sem especificar qualquer comparação.

Site: Como usar Comparador e comparáveis ??em Java? Com exemplo

Leia mais: Como usar Comparador e no Comparável Java? Com exemplo

Comparable é para objetos com uma ordem natural. O objeto em si sabe como é ser encomendados.
Comparator é para objetos sem uma ordenação natural ou quando você quiser usar uma ordem diferente.

Diferença entre Comparador e as interfaces comparáveis ??

Comparable é usado para comparar-se usando com outro objeto.

Comparator é usado para comparar dois tipos de dados são objetos.

Se você vê diferença, então lógica entre estes dois é Comparator em Java comparar dois objetos fornecidos a ele, enquanto interface de Comparable compara "isto" de referência com o objeto especificado.

Comparable em Java é usado para implementar ordenação natural do objeto. Em Java API String, Data e classes de mensagens publicitárias implementar a interface Comparable.

Se qualquer classe implementar a interface Comparable em Java, em seguida, coleção de esse objeto seja List ou Array podem ser classificados automaticamente usando Collections.sort() ou método Array.sort() e objeto serão classificados com base em há ordem natural definido pelo método compareTo.

Objetos que implementam Comparable em Java podem ser usadas como chaves em um mapa ordenado ou elementos de um conjunto ordenado por exemplo TreeSet, sem especificar qualquer Comparator.

A 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

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top