TreeSet

6 respostas
Z

Pessoal

eu tenho uma classe usuario que implementa a interface Comparable, na classe usuario tem os elementos nome e idade.
eu criei alguns objeto da classe usuarios e adicionei a um collection, eu crie tambem um Iterator para imprimir todos elementos, ate ai td bem, só que ele imprime ordenado pela idade e eu queria pelo nome, alguem sabe como eu posso fazer isso? eu estou usando o TreeSet

6 Respostas

sergiotaborda

zorro:
Pessoal

eu tenho uma classe usuario que implementa a interface Comparable, na classe usuario tem os elementos nome e idade.
eu criei alguns objeto da classe usuarios e adicionei a um collection, eu crie tambem um Iterator para imprimir todos elementos, ate ai td bem, só que ele imprime ordenado pela idade e eu queria pelo nome, alguem sabe como eu posso fazer isso? eu estou usando o TreeSet

Se vc implementou compareTo com base na idade então é assim que ele apresentará. Só que usuário não é um objeto comparável (não existe um ordem intrinseca a Usuário. Não é como um numero que tem um ordem intrinseca) por isso deve ser implementado um Comparator e ai vc pode criar vários comparators cada um com sua regra de comparação.

Z

eu nao to conseguindo criar um compareTo para o nome

public String compareTo (Object o) {

Usuario e = (Usuario) o;

return e.nome;

}

da erro, fala que tem q ser inteiro, para a idade da certo

public int compareTo (Object o) {

Usuario e = (Usuario) o;

return e.idade;

}

como eu faço para String?

felipealbuquerque

O seu compareTo() realmente não está correto. Você pode, por exemplo, retornar a comparação da String do objeto a ser comparado.

public String compareTo(Object obj) {
    Usuario user = (Usuario) obj;
    return this.nome.compareTo(user.nome);
}

No código acima, estou pegando o nome do objeto do qual o método compareTo() foi chamado e comparando com o nome do objeto a ser comparado. Será retornado o resultado da comparação dessas duas Strings, e isso fará com que eles sejam corretamente ordenados no TreeSet.

Z

obriago funcionou, so q o tipo de retorno tem q continuar sendo int, senao da incompatible type, + obrigado vc ajudou bastante.

o codigo ficou assim

public int compareTo(Object obj) { Usuario user = (Usuario) obj; return this.nome.compareTo(user.nome); }

felipealbuquerque

Ops! Falta de atenção minha, perdão… hehe! :lol:

sergiotaborda

zorro:
eu nao to conseguindo criar um compareTo para o nome

public String compareTo (Object o) {

Usuario e = (Usuario) o;

return e.nome;

}

da erro, fala que tem q ser inteiro, para a idade da certo

public int compareTo (Object o) {

Usuario e = (Usuario) o;

return e.idade;

}

como eu faço para String?

Essa não é a forma de implementar comparable. Comparable (comparável) significa que A é comparado com B
Se A é maior que B retorna um numero positivo, se A é mneor que B retorna um numero negativo. Se são iguais retorna 0.
Por isso que o retorno é sempre int.

Para compara usando a idade

public int compareTo (Object o) {
        Usuario e = (Usuario) o;
        return this.idade - e.idade;
    }

Usando o nome

public int compareTo (Object o) {
        Usuario e = (Usuario) o;
        return this.nome.compareTo(e.nome);
    // String tb é comparable
    }

Usando os dois

public int compareTo (Object o) {
        Usuario e = (Usuario) o;
        if ( this.idade - e.idade!=0) { // primeiro por idade
           return  this.idade - e.idade;
        }
 // é a mesma idade então por nome
        return this.nome.compareTo(e.nome);
    }
Criado 10 de novembro de 2007
Ultima resposta 10 de nov. de 2007
Respostas 6
Participantes 3