Interface comparable X comparator

ae pessoal lendo a kathy fiquei com duvida em qdo usar um ou outro e qual a diferença exata deles… por exempl oa sintaxe nao entendi do comparator ele usa o metodo do comparable?

public int compare(String a, String b){
return a.getTitulo().compareTo(b.getTitulo());
}

nao conseguir entendi direito a sintaxe… a kathy pecou nesse ponto quem puder me ajudar agradeço heh!!

Espero ter te ajudado colega:
Essa explicação fala quando e por que usar cada um interface.

Comparable

Interface que define a operação de comparação do próprio objeto com outro, usado para definir a ordem natural dos elementos de uma coleção. Pode ser usado caso os objetos que serão adicionados na coleção já implementem a interface (Integer, Double, String, etc.), ou serão implementados pelo programador, que tem a chance de embutir esta interface em seu código.

Comparator

Interface que define a operação de comparação entre dois objetos por um objeto externo. É utilizado quando os objetos a serem adicionados não podem ser modificados para aceitarem a interface Comparable (são de uma biblioteca de terceiros, por exemplo), ou é necessária a troca da estratégia de ordenação em tempo de execução (ordenação das linhas de uma tabela, por exemplo). Esta interface provê maior flexibilidade, sem custo adicional significativo. Prefira seu uso, ao invés da interface Comparable, a não ser que esta seja necessária (isto é, você usa uma classe que espera objetos que a implementem) ou se a própria semântica dos objetos exija esa ordem natural (o que é bem subjetivo e específico do domínio/sistema).

Acho que o codigo que voce postou, seria um exemplo de uma classe que implementa as duas interfaces…porque tem o metodos compare e compareTo…Nao entendi ao certo, o porque de voce precisar usar aquela sintaxe postada…Mas…espero ter esclarecido suas ideias. Sugiro tambem que veja na API a diferença entre os dois.
http://java.sun.com/j2se/1.4.2/docs/api/java/lang/Comparable.html
http://java.sun.com/j2se/1.4.2/docs/api/

1 curtida

O Comparable é uma interface que serve para você dizer que um determinado objeto tem uma ordem natural e, portanto, pode ser ordenado. Note que ele associa essa característica a sua classe. Por exemplo:

public class Pessoa implements Comparable<Pessoa>
{
   private String nome;
   private int idade;

   public Pessoa(String nome, int idade) {
      this.nome = nome;
      this.idade = idade;
   }

   public int getIdade() {return idade;}
   public int getNome() {return nome;}

   public int compareTo(Pessoa other) {
          return Collator.getInstance().compareTo(nome, other.nome);
   }
}

Com a classe pessoa dessa forma, poderíamos criar uma lista de pessoas e ordena-las usando:
Collections.sort(listaDePessoas);

Simples! O java, vendo que uma pessoa é comparável, consegue fazer a ordenação sem precisar de mais nada.

Agora, o que aconteceria se tivéssemos que ordenar as pessoas em ordem de idade, ou na ordem alfabética reversa, sem alterar a ordenação “default” de nosso programa?

Para isso, damos ao java um comparador, ou seja, um objeto da classe Comparator.

public class ComparadorDeIdadesDaPessoa implements Comparator<Pessoa> {
   public int compareTo(Pessoa aPerson, Pessoa anotherPerson) {
      return aPerson.idade - anotherPerson.idade;
   }
}

Para ordenar as pessoas por idade, agora precisaríamos só fazer:
Collections.sort(listaDePessoas, new ComparadorDeIdadesDaPessoa());

Note que, como nosso colega definiu, o Comparator é usado em outra classe, nesse caso o ComparadorDeIdadesDaPessoa, enquanto o Comparable serve para dizer que nossa classe, Pessoa, tem uma ordem natural e portanto pode ser comparada.

é infelizmente nao conseguir entender essas interface nao sei se é a confusao dos nomes… o meu problema é na implementacao delas… :frowning:

Assim Camilo, não tem muito o que entender, nem o que ficar em duvida.
O método compareTo serve para dizer a ordem natural dos objetos. O que quero dizer como ordem natural dos objetos, é dentro de uma coleção que você precise dar uma determinada ordem,você precisa assinar um contrato para dizer que esses objetos são ordenáveis.
Por exemplo, a ordem dos Wrappers é a ordem natural dos números a dos objetos String é a ordem alfabética e a ordem da classe Pessoa de sua aplicação?
O java não conhece a ordem natural de uma classe que não foi definida.Então ,para isso implementamos a interface Comparable.Se a classe Pessoa implementa Comparable e reescreve o método compareTo,dizendo que o atributo idade,é quem determina a ordem,então a ordenação se dará daquela forma.
Exemplo:

public class Pessoa implements Comparable{

  private int idade;
  private String nome;

  //getters and setters

   public int compareTo(Pessoa pessoa){

       if(this.idade > pessoa.getIdade())
           return 1;
       if(this.idade == pessoa.getIdade())
             return 0;
       else
              return -1;

  }


}

O código de compareTo retorna -1,se o objeto é menor,ou seja vem antes na ordem,0 se for igual,ou seja tem o mesmo valor na ordem,e 1 se for maior,ou seja na ordem natural vem depois.

Então,ai vem a interface Comparator…
Digamos que voce “comprou” essa classe Pessoa,e não tem acesso ao fonte dela,e só tem o .class dela e o javadoc,digamos que ela seja final.
Então,voce pode criar uma classe ComparatorPessoas que implements Comparator,e implementar um método compareTo,semelhante ao citado acima, e você tera como ordenar tua coleção.
Espero ter esclarecido o conceito Camilo.
Qualquer coisa…é só postar.

Só pra constar,a classe que nosso colega postou,a Collator,serve como um Comparator de Strings…
Eu não conhecia…
vale a pena ver a documentação:


http://java.sun.com/j2se/1.4.2/docs/api/java/text/Collator.html

antoniopopete entao a classe comparable é para ordem natural String, Integer etc, e a class Comparator eu que defino como vai ser minha ordenação por algo espeficio de minha classe por exemplo cpf, codigo do cliente. seria isso? entao a classe comparator posso implementar outras classes… e a comparable apenas as classes da api?

agora meu problema é na definicao da sintaxe. a kathy pegou pesado… por exemplo na class comparator eu uso um compareTO() que eh usado tb na class comparable… isos que me confude agora… mais vc me ajudou ai conseguir distinguir as duas… porem falta eu aprennder e entender o uso da sintaxe.

Primeira coisa,comparable e comparator são interfaces e não classes.E eu não disse isso,de ordem natural de String e Wrappers apenas.
Acho que (não sendo grosso),se você reler o tópico devagar e ler a API ,o link que postamos aqui, você entenderá melhor.
O que você chama de sintaxe,depende da necessidade…que você tem.
Poxa,não vejo uma forma melhor para exemplificar no momento…Experimentar reler o tópico de forma pausada.