Dúvida sobre o conjunto TreeSet

10 respostas
danielbussade

Olá todos no forum estou estudando sobre Collection , e estou tentando implementar uma coleção do tipo TreeSet, que é um conjunto que implementa dentre outras a interface Set.
A questão é a seguinte, na apostila FJ-11 da caelum ela diz que os elementos inseridos em um conjunto do tipo TreeSet quando percorridos são ordenados de acordo com o metodo definido de ordenação, que é a implementação da interface Comparable.
Agora olhando o javadoc da Classe TreeSet, percebi que ele nao implmenta a interface Comparable, então como ele ordena??

Obs:Eu nao passei nenhum Comparator para seu construtor.

Se algué puder me esclarecer melhor!!

Att

10 Respostas

T

Não é a classe TreeSet que tem de implementar Comparable (ela implementa SortedSet); é sua classe, que será inserida em um TreeSet, que tem de implementar Comparable ou então usar um Comparator.

danielbussade

Obrigado thingol, é que estava ficando confuso em relação a isso , tirou uma dúvida e tanto!!

Att

T

Você quer usar uma TreeSet, ou seja:

class Amigo implements Comparable{
    ...
}
SortedSet<String> amigos = new TreeSet<Amigo>();
amigos.add (new Amigo ("Renan Calheiros")); 
amigos.add (new Amigo ("Luís Inácio"));
amigos.add (new Amigo ("José Dirceu"));

ou você quer criar uma classe derivada a partir de TreeSet

class MinhaTreeSet extends TreeSet<String> {
...

ou você quer implementar a interface SortedSet

class MinhaImplementacaoDeArvoreBinaria implements SortedSet {
...

?

danielbussade

A primeira opção eu estou usando uma classe TreeSet:
Eis o código:

public class Principal {
	public static void main(String[] args) {
		Set conjunto = new TreeSet();
		conjunto.add("item 1");
		conjunto.add("item 2");
		conjunto.add("item 3");
		conjunto.add("item 3");

		Iterator i = conjunto.iterator();

		while (i.hasNext()) {
			Object elemento = i.next();
			String palavra = (String) elemento;
			System.out.println(palavra);
		}
	}
}

Neste exemplo entao o ordem sera dada pelo metodo implementado da Interface Comparable na classe String,
mas se fosse por exemplo um vetor de Contas //classe criada por mim, e eu nao tiver ainda implementado o metodo compareTo , o ordem a ser impressa será o que eu inseri certo??

Att

T

Não; vai dar um erro de execução em “add” se você não usar um Comparator ou não implementar Comparable.
(Em particular acho mais fácil e mais flexível usar um Comparator).

danielbussade

Thingol, eu executei o código aqui sem implementa a interface Comparable, e nem usar o comparator, e o código executou sem problema.

public class Conta {
	private int numero;
	private double saldo;

	public void setSaldo(double saldo) {
		if (saldo < 0)
			throw new IllegalArgumentException();
		else
			this.saldo = saldo;

	}

	public double getSaldo() {
		return this.saldo;
	}

	public void setNumero(int numero) {
		if (numero < 0)
			throw new IllegalArgumentException();
		else
			this.numero = numero;

	}

	public int getNumero() {
		return this.numero;
	}
	
	@Override
	public String toString() {
		// TODO Auto-generated method stub
		return "Conta criado com saldo de: " + this.saldo ;
	}

}


import java.util.HashSet;
import java.util.Iterator;
import java.util.Set;
import java.util.TreeSet;

public class Principal {
	public static void main(String[] args) {
		Set<Conta> vetContas = new TreeSet<Conta>();
		Conta c = new Conta();
		c.setSaldo(100);

		vetContas.add(c);

		Iterator<Conta> i = vetContas.iterator();

		while (i.hasNext()) {
			Conta outraConta = i.next();
			System.out.println(outraConta);
		}

	}
}

Se pudesse me esclarecer melhor, eu agradeceria!!

Att

Marky.Vasconcelos

O Comparable é para a ordenação do Set,
testa criar varias contas e colocar no vetor.
Daí sim você não teria a ordem que você quer.

T

Cuidado com os testes…
Você experimentou pôr mais de um objeto nesse Set?
No segundo objeto vai dar problemas.

danielbussade

Blz me desculpe. Mas porque que quando coloquei o segundo ele nao conseguiu imprimir, se ele nao tem o metodo de ordenação.
Porque ele nao imprimi na ordem que eu inseri??

Ah pra finalizar, eu posso dizer que a diferença basica, do TreeSet, e do HashSet e que o TreeSet, aceita um parametro do tipo Comparator, para comparar seus elementos, de poder implementar a interface Comparable, e o HashSet, só aceita ordenação através da implementação da interface Comparable, com a reescrita do metodo compareTo?

Att

A

?

Criado 22 de outubro de 2007
Ultima resposta 29 de jun. de 2010
Respostas 10
Participantes 4