Compare to

9 respostas
R
public int compareTo(pontuacao p1) {
		if(getEscore()>p1.escore){
			return 1;
		}if(getEscore()<p1.escore){
			return -1;
		}if(getEscore()==p1.escore){
		if (getNome()>p1.getNome()){
			return 1;
		}
		if(getNome()<p1.getNome()){
			return -1;
		}
		if(getNome().equals(p1.getNome()))
			return 0;
		
	}

olá amigos, estou com problema, já pesquisei e não consigo ver a diferença entre comparable e comparator..
e também o codigo acima da erro. Sei que é porque nome não pode ser comparado assim, mas de que jeito fazer .
ps: a solução com diff: ... eu n entendo se poderem me explicar ..
valeu

9 Respostas

drsmachado

Qual a tua dúvida?
A pergunta está bem confusa…

R

1º como fazer esse compareto ai que está na classe pontuacao ?
porque quando eu comparo nomes ele não da certo.

Kanin_Dragon

Jovem,

Existe uma grande diferença entre comparable e comparator. A interface comparable disponíbiliza o método compareTo, já a interface comparator disponíbiliza o método compare.

Faça uma pesquisa rápida no google sobre essas duas interfaces e poste suas dúvidas.

Abs,

drsmachado

Ok, mas só com estas informações é difícil.
Qual o tipo primitivo ou objeto que representa a variável nome?
Posta a classe completa.

R
import java.util.Iterator;
import java.util.Set;
import java.util.SortedSet;
import java.util.TreeSet;


public class pontuacao implements Comparable<pontuacao>{
	private String nome;
	private int escore;
	
	public pontuacao (){
		this(null,0);
	}
	public pontuacao(String nome,int escore){
		super();
		this.nome = nome;
		this.escore = escore;
	}

	public String getNome() {
		return nome;
	}

	public void setNome(String nome) {
		this.nome = nome;
	}

	public int getEscore() {
		return escore;
	}

	public void setEscore(int escore) {
		this.escore = escore;
	}
	public String toString(){
		return ("escore"+escore+"nome"+nome);
	}
	@Override
		public int compareTo(pontuacao p1) {
		  int diff = p1.escore - escore;  
	        return diff == 0 ? nome.compareTo(p1.nome) : diff; 
		}
	
	
}
esse comparetO que não entendo
JhowTroMundo
public int compareTo(pontuacao p1) {   
          int diff = p1.escore - escore;     
            return diff == 0 ? nome.compareTo(p1.nome) : diff;   
        }

Passa-se um objeto pontuacao pra esse método.

Caso a diferença dos atributos score seja igual a zero (ambos tem o mesmo score), retorna-se a comparação dos nomes (caso sejam iguais, um int (provavelmente -1, 0 ou 1 (Não sei como funciona compareTo de String)). Caso a diferença de scores seja diferente de zero, retorna a diferença.

EDIT - Acabei de testar aqui: String.compareTo(String) retorna a diferença de quantidade de caracteres entre as strings comparadas. 0 para mesma quantidade, um numero negativo caso a string comparada tenha uma quantidade menor de caracteres, e positivo caso tenha quantidade maior do que a string passada como parametro.

EDIT 2 - Observe que não dá pra distinguir se o retorno é a diferença de score ou a diferença de quantidade de caracteres do nome.

EDIT 3 - O primeiro EDIT não é totalmente o correto. Li o JavaDoc desse método, e percebi que o buraco é muito mais embaixo. De qualquer forma, o método retorna 0 se as duas strings forem iguals, e a diferença de caracteres é retornada quando as uma string está contida no inicio da outra, que tem um length maior.

R
Como será essse compareto com if
public boolean equals(Object obj) {
		if (this == obj)
			return true;
		if (obj == null)
			return false;
		if (getClass() != obj.getClass())
			return false;
		Escore other = (Escore) obj;
		if (nome == null) {
			if (other.nome != null)
				return false;
		} else if (!nome.equals(other.nome))
			return false;
		return true;
		
	}
e como fazer o equals para o campo pontuacao? consegui so rpa nome
JhowTroMundo
*robson:
Como será essse compareto com if
public boolean equals(Object obj) {
		if (this == obj)
			return true;
		if (obj == null)
			return false;
		if (getClass() != obj.getClass())
			return false;
		Escore other = (Escore) obj;
		if (nome == null) {
			if (other.nome != null)
				return false;
		} else if (!nome.equals(other.nome))
			return false;
		return true;
		
	}
e como fazer o equals para o campo pontuacao? consegui so rpa nome

O compareTo está usando um if (procure por Operador Ternário). Tente você mesmo codificar o método usando um if comum.

A ideia do equals é verificar se dois objetos possuem o mesmo valor. Se quer comparar pontuacao com pontuacao, pontuacao.equals(pontuacao)

EDIT - Se a "pontuacao" a que você se refere é o atributo 'escore' ( que é um tipo primitivo), não é possível usar o equals (tipos primitivos não são classes, e portanto não possuem métodos). Nesse caso, use o == .

R
pronto fiz o equals de pontuação: isso qeu dizer qeu se eu quiser fazer por exemplo o metodo equals com dois objetos ele vai ver se os dois cmapos sao iguais.. ? por exemplo e.equals(e1); como fazer pra mostrar se sao iguais ou se um é maior que o outro?
public boolean equals(Object obj) {
		if (this == obj)
			return true;
		if (obj == null)
			return false;
		if (getClass() != obj.getClass())
			return false;
		Escore other = (Escore) obj;
		if (nome == null) {
			if (other.nome != null)
				return false;
		} else if (!nome.equals(other.nome))
			return false;

		else if(pontuacao==0){
			if(other.pontuacao!=0)
				return false;
		}else if(!(pontuacao==other.pontuacao))
			return false;
		return true;
Criado 6 de junho de 2011
Ultima resposta 6 de jun. de 2011
Respostas 9
Participantes 4