Dúvidas sobre Conjuntos + Comparator

7 respostas
derheimen

Este código abaixo lança uma Exceção :
Exception in thread "main" java.lang.ClassCastException: capitulo07.TestComparator

Sei que o conjunto TreeSet é classificado pela ordem natural, mas oque ocorre para que seja lançada esta exceção.
Alguém poderia me explicar o porque deste erro ?

public class TestComparator implements Comparator<TestComparator>{

	TestComparator( ) {}
	TestComparator(int vlr) { this.testNumber = vlr; }
	int testNumber;

	public static void main( String args[] ) {
              Set <TestComparator> s1 = new TreeSet<TestComparator>();
              s1.add(new TestComparator(10));
              s1.add(new TestComparator(15));
	}

	public int compare( TestComparator t1 , TestComparator t2 ) {
	       return t2.testNumber - t1.testNumber;
	}
}

Desde de já agradeço.

7 Respostas

T

Cuidado, Comparator != Comparable

Você pode usar um SortedSet (TreeSet) :

  • Usando uma classe que implementa Comparable (é o que você provavelmente queria desde o começo)
    ou
  • Passando como parâmetro para o construtor um objeto de uma classe que implementa Comparator. A vantagem disso é que você pode ter vários SortedSets com diversas ordens e usando a mesma classe-base.

Vou dar um exemplo daqui a pouco.

derheimen
Implementei usando o Comparable, como descrito abaixo:
public class TestComparable implements Comparable<TestComparable>{
	TestComparable(int vlr) { this.testNumber = vlr; }
	Integer testNumber;

	public static void main( String args[] ) {
               Set <TestComparable> s1 = new TreeSet<TestComparable>();
               s1.add(new TestComparable(10));
               s1.add(new TestComparable(15));
	}

	public int compareTo(TestComparable o) {
	       return testNumber.compareTo(o.getTestNumber());
	}

	public Integer getTestNumber() { return testNumber;	}
}
Funcionou belezinha. Mas qual a principal diferenca entre Comparator e Comparable ?
T

Digamos que você tenha uma classe “Cliente” com três campos: nome, endereço e telefone. Se você implementasse Comparable na classe Cliente, e o método compare só usasse o nome, você só conseguiria ordenar por nome (digamos).

Mas se você criar três classes que implementam Comparator (uma delas pega 2 objetos Cliente e compara por nome, outra por endereço e outra por telefone), você pode ordenar por nome, ou por endereço, ou por telefone.

LPJava

ate hoje isso me confunde :?

antoniopopete

Acho que esse topico pode esclarecer sua mente:

http://www.guj.com.br/posts/list/49300.java#259105 :smiley:

silva.fernandes

Caso naum fique claro.

Dá uma olhadinha nessa super aula que nosso amigo Mantu deu . :shock:
http://www.guj.com.br/posts/list/45985.java

Falowww

T+

LPJava

ele sempre dar aula!! :smiley:

Criado 11 de janeiro de 2007
Ultima resposta 12 de jan. de 2007
Respostas 7
Participantes 5