Comparator, compare - Comparable, compareTo

Alguém por gentileza poderia esclarecer uma dúvida?

Vale lembrar que não é má vontade de ler API e pesquisar no fórum. Estou fazendo isso desde manhã e não consigo entender como ordenar um List pelo atributo nome.
Fiz algo mais ou menos assim:

... public void ordenaLista(List<Contatos> contato) { Collections.sort(contato, new Comparator() { //aqui eu tenho um Comparator e pelo que entendi preciso de um método compare() public int compare(Object c1, Object c2) { //aqui tem o método compare() que sinceramente não entendi o funcionamento return (Contatos.nome(c1).compareTo(new Contatos.nome(c2)); //o problema está aqui, porém não consigo arrumar isso } } ); }

Não funciona!

Qual a diferença entre compare e compareTo?

Sei que os dois retornam um inteiro 1 se maior, 0 se igual e -1 se menor.

Alguém pode dar uma clareada?

Obrigado!

Você precisa de mais umas aulas lá em Hogwarts (onde o Harry Potter estuda, lembra-se?) Basicamente deve ser algo como (não estou com o compilador Java aqui, então não tenho como testar direito):

 ...  
 public void ordenaLista(List<Contatos> contato) {  
         Collections.sort(contato, new Comparator<Contatos>() { //aqui eu tenho um Comparator e pelo que entendi preciso de um método compare()  
             public int compare(Contatos c1, Contatos c2) { //aqui tem o método compare() que sinceramente não entendi o funcionamento  
                 return (c1.nome.compareTo (c2.nome)); // estou supondo que você tenha um "public String nome" ou coisa parecida.
// Se em vez disso você tiver um "getter" para o nome, você poderia usar:
//                 return (c1.getNome().compareTo (c2.getNome());
             }  
         });
     }

Mais em http://www.guj.com.br/posts/list/54036.java#284273

[quote=thingol]

... public void ordenaLista(List<Contatos> contato) { Collections.sort(contato, new Comparator<Contatos>() { //aqui eu tenho um Comparator e pelo que entendi preciso de um método compare() public int compare(Contatos c1, Contatos c2) { //aqui tem o método compare() que sinceramente não entendi o funcionamento return (c1.nome.compareTo (c2.nome)); // estou supondo que você tenha um "public String nome" ou coisa parecida. // Se em vez disso você tiver um "getter" para o nome, você poderia usar: // return (c1.getNome().compareTo (c2.getNome()); } }); } [/quote]

Funcionou thingol!
Nas pesquisas que eu fiz, em quase todos os tópicos que tratavam de assuntos parecidos com esse, tinha seu nome ajudando thingol.

Eu tenho os getters aqui sim.

Funcionar funcionou, agora o importante é entender o porque.
Porque preciso do compare e não somente do compareTo, etc.
Vou dar uma estudada aqui.

Valeu!

Vou lhe explicar resumidamente por quê.

Se você já implementou algum “sort”, deve saber que ele usa comparações para poder ordenar dois elementos. As comparações são usualmente feitas com “<”, “==” ou “>”. (no caso de números).

Você sabe que na verdade o “sort” só precisa saber, dos seus dados, como é que um deles é maior ou igual ao outro.
E é aí que entra o “Comparator”. Ele é uma forma de você ensinar ao “sort” como é que se faz “<”, “==” ou “>” com 2 objetos da classe Contatos (por exemplo).

[quote=thingol]Vou lhe explicar resumidamente por quê.

Se você já implementou algum “sort”, deve saber que ele usa comparações para poder ordenar dois elementos. As comparações são usualmente feitas com “<”, “==” ou “>”. (no caso de números).

Você sabe que na verdade o “sort” só precisa saber, dos seus dados, como é que um deles é maior ou igual ao outro.
E é aí que entra o “Comparator”. Ele é uma forma de você ensinar ao “sort” como é que se faz “<”, “==” ou “>” com 2 objetos da classe Contatos (por exemplo).
[/quote]

Até aí tudo bem.
Nesse momento a dúvida maior é o porque utilizar o compare em conjunto com o compareTo.

E também, para esse caso eu não precisei implementar Comparable na minha classe.
Isso ocorreu porque o que foi comparado era String e essa classe já implementa o tal Comparable?

Cara, excelente!

Como falaram na época, se isso fosse um artigo aqui do GUJ, facilitaria DEMAIS a busca.

Parabéns de verdade.

Normalmente você faz com que sua classe implemente Comparable se você souber que ela tem uma “ordem natural” (um exemplo é um java.util.Date - não faz sentido comparar duas datas, primeiramente pelo dia, depois pelo mês e então pelo ano.)

Você usa um Comparator se você quiser usar com uma coleção de objetos que pertencem a uma classe que pode ser ordenada de várias maneiras - por exemplo, uma lista de Contato pode ser ordenada por nome, por endereço, por sobrenome, por cidade etc.)