Tenho uma classe Estudante que possue uma lista de Inscricoes assim como uma ID única.
Quero colocar um grupo de objetos dessa classe Estudante dentro de um TreeSet. Utilizo TreeSet porque os elementos estão sempre ordenados e únicos.
Preciso ordenar os estudantes pela quantidade de inscrições que eles têm. Quanto mais inscrições, mais alto na lista um estudante deve estar.
Minha classe estudante têm esses métodos_:
...
@Override
public boolean equals(Object obj) {
if(this == obj)
return true;
if((obj == null) || (obj.getClass() != this.getClass()))
return false;
if(obj instanceof Cours) {
Etudiant e = (Etudiant)obj;
return getIdEtudiant() == e.getIdEtudiant();
} else {
return false;
}
}
@Override
public int hashCode() {
return getIdEtudiant();
}
public int compareTo(Etudiant e) {
return Integer.valueOf(getMesCours().size()).compareTo(e.getMesCours().size()) ;
}
O problema é que quando o método compareTo retorna 0, o que indica que os estudantes têm o mesmo número de inscições, o TreeSet não inclue o estudante na lista. Ele assume que os estudantes são iguais…
Alguém saberia uma implementação do compareTo que resolvesse esse quebra-cabeça.
O código abaixo é adequado? (Suponho que os estudante têm nome, sobrenome e ID).
[code]public int compareTo(Etudiant e) {
int result = getNom().compareTo(e.getNom());
if (result == 0) {
result = getPrenom().compareTo(e.getPrenom());
}
if (result == 0) {
result = getId().compareTo(e.getId());
}
if (result == 0) {
result = Integer.valueOf(getMesCours().size()).compareTo(e.getMesCours().size());
}
return result;
}[/code]
O espírito da coisa é: tem que haver algum critério de desempate. E, pra terminar, em vez de comparar as String’s com compareTo(), seria melhor eu ter usado um Collator…
Você deve alterar o compareTo para que, quando a quantidade de inscrições for igual, ele utilize outra propriedade, como o nome do estudante por exemplo. Assim, você terá um conjunto ordenado por número de inscrições e por nome. Exemplo: