Dúvida sobre o conjunto TreeSet

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

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.

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

Att

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 {
...

?

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

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).

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

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.

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

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

?