Uso do compareTo() - Está correto?

Por favor, a forma como uso o compareTo() abaixo está dentro do usual? Ou definitivamente ele não é pra essa finalidade?

[code] public int compareTo(Object o) {
if (o instanceof Testes) {
System.out.println(“true”);
return 1;
}
System.out.println(“false”);
return -1;

}[/code]

Não, compareTo deve indicar se o seu objeto é maior, menor ou igual ao objeto que está sendo comparado.

Nesse caso a tua lógica só valida se são ou não do mesmo tipo!

Nada a ver…
O compareTo deve ser implementado numa lógica de ordenação. Se “este” objecto é de alguma forma menor que o objecto “o” então deve retornar um número negativo. Se é maior, um número positivo e se são iguais, retorna 0.

[quote=andredecotia]Por favor, a forma como uso o compareTo() abaixo está dentro do usual? Ou definitivamente ele não é pra essa finalidade?

[code] public int compareTo(Object o) {
if (o instanceof Testes) {
System.out.println(“true”);
return 1;
}
System.out.println(“false”);
return -1;

}[/code][/quote]

Esse compareTo simplesmente nao tem nada haver com o usual. Se vc chamar um sort() de uma lista de Testes igual esta ai, vai sempre retornar 1. Ou seja sempre seu “this” vai ser maior que o outro objeto a ser comparado.

[quote=andredecotia]Por favor, a forma como uso o compareTo() abaixo está dentro do usual? Ou definitivamente ele não é pra essa finalidade?

[code] public int compareTo(Object o) {
if (o instanceof Testes) {
System.out.println(“true”);
return 1;
}
System.out.println(“false”);
return -1;

}[/code][/quote]

Opa, andré!
O método compareTo é usado para comparar dois objetos, semelhante ao método equals. Porém, eu prefiro o uso do compareTo, já que existem determinadas classes (as GlazedLists, por exemplo) que fazem uso do compareTo para executar suas funcionalidades.

brigado pelas respostas gente, mas

o q vc quer dizer com maior ou menor? em questão númerica mesmo? como assim um objeto maior ou menor q outro ex:

ObjetoAndre referenciaA; ObjetoAndre referenciaB; ObjetoAndre referenciaC;

como assim maior q o outro? :?: :shock:

[quote=andredecotia]brigado pelas respostas gente, mas

o q vc quer dizer com maior ou menor? em questão númerica mesmo? como assim um objeto maior ou menor q outro ex:

ObjetoAndre referenciaA; ObjetoAndre referenciaB; ObjetoAndre referenciaC;

como assim maior q o outro? :?: :shock: [/quote]

Algo assim:

public class Aluno implements Comparable<Aluno>
{
   private int id;
   public int getId() { return id; }

   @Override public int compareTo(Aluno that)
   {
      return Integer.valueOf(id).compareTo(Integer.valueOf(that.getId()));
   }
}

[quote=andredecotia]brigado pelas respostas gente, mas

o q vc quer dizer com maior ou menor? em questão númerica mesmo? como assim um objeto maior ou menor q outro[/quote]

Se for um número, a comparação é numérica. Se for uma String, a comparação é pela ordem alfabética, ou seja, é menor aquela que vem primeiro no dicionário.

Mas você deve estar perguntando… e para as classes que criamos, como Carro, Pessoa, Aluno, Funcionario, que diabos é isso de um ser maior que o outro? :evil:

A resposta é simples, você como criador do sistema é quem decide! Pense no seguinte: Dentro do universo que estou programando qual deve ser a regra para saber se um objeto é maior do que outro? Se eu fosse ordená-los qual deveria vir primeiro?

Justamente essa regra que deve ser implementada no compareTo. Geralmente escolhe-se um ou mais atributos e faz-se a comparação desses atributos.

Na mensagem acima tem um exemplo, em que a comparação entre objetos do tipo Aluno é baseada no ID (que pode ser o número de matrícula por exemplo). Por que ele escolheu o ID? Porque isso é o que faz mais sentido para o projeto dele, toda vez que uma lista de alunos for ordenada a ordenação deve ser por número de matrícula.

Poderia ser pelo nome, nesse caso a ordenação mostraria os alunos em ordem alfabética.

Se fossem os alunos de uma lista de classificação de vestibular, a ordenação poderia ser pela nota em ordem decrescente. Quem teve a melhor nota vem em primeiro, e o pior em último.

Tudo depende do que o cliente mandou.

Usualmente, para classes quaisquer, não se implementa Comparable.

Em vez disso, usa-se um ou mais Comparators adequados para essa classe. Isso é porque ela normalmente é usada para ordenação de listas, mas como você deve ter percebido, a ordenação depende do relatório a ser usado (por exemplo, ordenar por nome, ou por ID, ou por endereço, ou por cidade, ou até por número de telefone - quem sabe?).

Implemente Comparable apenas quando faz algum sentido - por exemplo, para a classe BigDecimal ou BigInteger, faz sentido você usar Comparable.

Entretanto, se você já estudou um pouquinho só de matemática, não faz muito sentido que a classe Complex implemente Comparable.
Isso porque não há como saber se -1+2i é menor ou maior que 1 - 2i.

oi gente, valeu ehm!

:smiley: :wink:

gomesrod, cara, adorei a explicação viu… brigadão…

abraços,

AS