* Dúvidas TreeSet

5 respostas
javaEd.com

Fala galera, blz?!?!?!

Estou usando TreeSet em uma classe aqui e surgiu a seguinte exceção :
Exception in thread "main" java.lang.ClassCastException: br.com.edson.collection.Alunos
...

O erro está nesse laço :

while (i < 5) {
			
			alunos.add(new Alunos(JOptionPane.showInputDialog("Digite nome:")));
			i++;
		}
...

Depurei mas não entendi o pq, se alguém puder esclarecer essa dúvida, e gostaria de dicas tbm caso meu código esteja com algum tipo de hard-code ou coisa do tipo, vwl pela ajuda, segue códigos :

package br.com.edson.collection;

public class Alunos {

	String nome = "";
	long ra = 0;

	public Alunos(String nome) {
		this.nome = nome;
	}

}
***********************
package br.com.edson.collection;

import java.util.*;

import javax.swing.*;

public class TestaAlunos implements Comparable<String> {

	static TestaAlunos testaAlunos =  new TestaAlunos();
	static TreeSet<Alunos> alunos  =  new TreeSet<Alunos>();
	static int i = 0;

	public static void main(String[] args) {

		while (i < 5) {
			
			alunos.add(new Alunos(JOptionPane.showInputDialog("Digite nome:")));
			i++;
		}

		testaAlunos.compareTo(alunos.toString());

		Iterator<Alunos> listaAlunos = alunos.iterator();

		while (listaAlunos.hasNext()) {
			System.out.println("-" + listaAlunos.next());
		}

	}

	public int compareTo(String nome) {

		return nome.compareTo(alunos.toString());
	}

}

Obrigado, abraços

5 Respostas

T

Dica número 1: um nome de classe deve estar no plural só se ele representar uma coleção. No seu caso, a classe deveria ser “Aluno”, não “Alunos”.
Dica número 2: quem tem de implementar Comparable é a classe Alunos.

public class Aluno implements Comparable<Aluno> {
...
     public int compareTo(Aluno aluno) {  
   
         return nome.compareTo(aluno.nome);  
     } 
}
javaEd.com

Obrigado pela dica Thingol, somente esclarecendo, devo implementar a interface Comparable na classe onde estou declarando meu atributo nome do tipo String?????????????????qual o motivo para eu declarar nessa classe ao invés da outra classe?

Valeu pela dica do nome tbm, e acho que está certo agora, mas está imprimindo assim :

Iterator<Aluno> listaAlunos = alunos.iterator();


		while (listaAlunos.hasNext()) {
			System.out.println(" - " + listaAlunos.next());
		}
- br.com.edson.collection.Aluno@1fe88d
 - br.com.edson.collection.Aluno@b60b93
 - br.com.edson.collection.Aluno@1b1fbf4
 - br.com.edson.collection.Aluno@148662
 - br.com.edson.collection.Aluno@1829e6f

Tentei algumas coisas como chamar o método toString(), mas não consegui, como imprimo os nomes que entro no JOptionPane??

Valeu mesmo pelas dicas e desculpe por essa dúvida básica, mas tenho a impressão de ser pelo fato do generics ser da classe Aluno, tentei passar para String só que teria que mudar o comportamento do TreeSet tbm, e isso nao eh o proposito...

Como eu imprimo os nomes?

Obrigado

[]'s

T

Você tem de implementar o método “public String toString()” na classe Alunos.

javaEd.com

Thingol, show de bola, ta perfect agora, vlw

Você poderia esclarecer aquela dúvida anterior minha por gentileza, qual o principal motivo que precisei implementar a interface Comparable na minha classe Aluno ao invés da outra classe, seria pelo motivo de eu ter implementado o atributo nome do tipo String nessa classe???

Se puder esclarecer ficaria grato, no mais valeu mesmo, está resolvido meu problema!!!

Obrigado

T

Se você ler corretamente a documentação de java.util.TreeSet, vai ver que você precisa de fazer uma de duas coisas:

  • Ou a classe X dos objetos que vão ser inseridos nesse TreeSet<X> deve implementar Comparable<X>,
  • Ou então você deve passar um objeto de uma classe Y que implemente a interface Comparator<X>.

Não faz sentido nenhum declarar em outra classe.

Criado 17 de setembro de 2008
Ultima resposta 17 de set. de 2008
Respostas 5
Participantes 2