Problema com Comparator/Comparable

Olá!

Estou com um quebra-cabeça aqui…

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…

Cara,

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:

Inscrições Nome
10 João
9 Maria
9 Raul
7 José

Opa!

Valeu roger, ça marche!!!

Só uma correção.

No meu caso, o número de inscrições de um estudante é o parametro mais importante para a ordenação de elementos. Então o método fica assim :

[code] int result = Integer.valueOf(e2.getMesCours().size()).compareTo(e1.getMesCours().size());

	if (result == 0) {
		result = e1.getIdEtudiant().compareTo(e2.getIdEtudiant());
	}

	return result;[/code]