Dúvida básica, usando pela primeira vez o Comparable e compareTo
11 respostas
A
andredecotia
Dúvida básica, usando pela primeira vez o Comparable e compareTo... Pq dá pau? Erro de execução... NullPointerException...
packagecorejava.comparetocomparablecompator2;publicclassContaCorrenteimplementsComparable<ContaPoupanca>{privateintsaldo;// = (int) 600.00;// castingpublicintgetSaldo(){returnsaldo;}publicvoidsetSaldo(intsaldo){this.saldo=saldo;}publicintcompareTo(ContaPoupancacontaPoupanca){if(getSaldo()==contaPoupanca.getSaldo()){System.out.println("Saldo de CC é igual CP");return-1;}if(getSaldo()!=contaPoupanca.getSaldo()){System.out.println("Saldo de CC diferente de CP");return0;}return0;}publicstaticvoidmain(String[]args){ContaPoupancacp1=newContaPoupanca();cp1.setSaldo(100);newContaCorrente().setSaldo(50);newContaCorrente().compareTo(null);}}
Dá NullPointerException na sua linha 16, não? Isso quando você passa null para compareTo.
A
andredecotia
É que percebí q qdo. não ponho null dá erro de compilação… Tem alguma sugestão?
E
entanglement
Não escreva programas usando o compilador para tirar os erros de compilação. (não passe null para um método só para tirar o erro de compilação).
Escreva programas usando a cabeça e lendo a documentação. O javadoc é seu amigo e você, de quebra, aprende inglês.
Quando você usa compareTo, é para comparar com outro objeto ContaPoupanca, não? Crie esse outro objeto para poder fazer a comparação.
Adaylon
não entendi pq o null???
A
andredecotia
hmmm… será q se não for pedir muito… se pudesse… vc poderia escrever o código correto pra mim? fiz já bastante mudança de acordo com q foi dito…
abração
ViniGodoy
Por que você está comparando coisas de classes diferentes?
packagecorejava.comparetocomparablecompator2;publicclassContaCorrenteimplementsComparable<ContaPoupanca>{privateintsaldo;// = (int) 600.00;// casting publicintgetSaldo(){returnsaldo;}publicvoidsetSaldo(intsaldo){this.saldo=saldo;}publicintcompareTo(ContaPoupancacontaPoupanca){if(getSaldo()==contaPoupanca.getSaldo()){System.out.println("Saldos iguais");return0;//Leia a documentação.}if(getSaldo()>contaPoupanca.getSaldo()){System.out.println("Saldo dessa conta maior que o da recebida");return1;}System.out.println("Saldo dessa conta menor que o da recebida");return-1;}publicstaticvoidmain(String[]args){ContaPoupancacp=newContaPoupanca();cp.setSaldo(100);ContaCorrentecc=newContaCorrente();cc..setSaldo(50);cc.compareTo(cp);}}
Em todo caso, é bom ler a documentação (aliás, já deve ser o quinto ou sexto tópico que te digo isso). O comparable indica se um objeto é igual, maior ou menor que outro. Não se os objetos são iguais ou diferentes. Teste de igualdade é feito pelo equals. A documentação também diz que o método deve retornar 0 (e não -1), quando os métodos forem iguais, >0 se o objeto em questão for maior que o recebido ou <0 caso contrário.
E
entanglement
// Quando você usa "Comparable", normalmente é para comparar com a mesma classe,// (ou seja, você só compara maçãs com maçãs, não com laranjas), não com outra// classe. A menos que você tenha 2 classes que são derivadas de uma superclasse. // No seu caso, provavelmente você teria algo como:publicclassContaimplementsComparable<Conta>{privateintsaldo;publicintgetSaldo(){returnsaldo;}publicvoidsetSaldo(intsaldo){this.saldo=saldo;}publicintcompareTo(ContaoutraConta){if(getSaldo()==outraConta.getSaldo())return0;elseif(getSaldo()<outraConta.getSaldo())return-1;elsereturn+1;}publicstaticvoidmain(String[]args){ContaCorrentecc=newContaCorrente();ContaPoupancacp=newContaPoupanca();cc.setSaldo(100);cp.setSaldo(200);if(cc.compareTo(cp)<0){System.out.println("O saldo da conta corrente é menor que o da poupança.");}elseif(cc.compareTo(cp)>0){System.out.println("O saldo da conta corrente é maior que o da poupança.");}else{System.out.println("Os saldos de ambas as contas são iguais.");}}}classContaCorrenteextendsConta{}classContaPoupancaextendsConta{}
E
entanglement
ViniGodoy:
A documentação também diz que o método deve retornar 0 (e não -1), quando os métodos forem iguais, 1 se o objeto em questão for maior que o recebido ou -1 caso contrário.
A rigor, só é preciso que o número seja 0 se igual, menor que zero se menor, e maior que zero se maior.
Portanto, o teste deve sempre ser contra == 0 ou < 0 ou > 0. É que a implementação padrão de muitos "compareTo" é esse (0, -1, +1), mas nada impede que alguém simplesmente compare 2 inteiros, por exemplo, e retorne a diferença, como resultado de compareTo.
Se não houver overflow ou underflow, a diferença também funciona. (Infelizmente, como há esse risco de overflow ou underflow, na prática a diferença não é suficiente. )
sergiotaborda
entanglement:
ViniGodoy:
A documentação também diz que o método deve retornar 0 (e não -1), quando os métodos forem iguais, 1 se o objeto em questão for maior que o recebido ou -1 caso contrário.
A rigor, só é preciso que o número seja 0 se igual, menor que zero se menor, e maior que zero se maior.
Portanto, o teste deve sempre ser contra == 0 ou < 0 ou > 0. É que a implementação padrão de muitos "compareTo" é esse (0, -1, +1), mas nada impede que alguém simplesmente compare 2 inteiros, por exemplo, e retorne a diferença, como resultado de compareTo.
Se não houver overflow ou underflow, a diferença também funciona. (Infelizmente, como há esse risco de overflow ou underflow, na prática a diferença não é suficiente. )
Exatamente, não precisa ser exactamente 1 ou 1 apenas interessa como se compara com zero.
Contudo quero aproveitar para tambem sublinhar que a diferença (subtração) não pode ser usada por causa dos over e underflow. E especialmente comparando double e float nem o operador > e < deve ser usado. A implementação correta de um Comparable ou Comparator é muito mais complexa do que parece ao iniciante. (Ler efective java ajuda a entender o erro).
A moral da historia é : nunca use contas para implementar comparação.
E portanto, usar 1, 0, -1 é mais natural. Contudo, é bom sempre delegar a comparação aos tipos primitivos e no caso de double e float aos métodos compare dos respetivos wrappers.
ViniGodoy
Confesso que na hora pensei certo, mas estava com meu exemplo na cabeça, e acabei escrevendo tudo errado.