Trees

Pessoal qual o critério de manipulação de uma classe TreeMap e TreeSet?
Pelo que entendi ele considera que algo existe pelos métodos de ordenação, estou correto?

package mateus.estudos;

import java.util.Set;
import java.util.TreeSet;

public class Main {

	public static void main(String[] args) {
		Cat c1 = new Cat("A", 2);
		Cat c2 = new Cat("A", 6);

		System.out.println("Equals : "+c1.equals(c2));

		Set gat = new TreeSet();
		gat.add(c1);
		gat.add(c2);
		
		System.out.println(gat.size());
		
		for (Object d : gat) {
			System.out.println(d);
		}

	}
}

class Cat implements Comparable<Cat> {
	String nome;
	int idade;

	public Cat(String nome, int idade) {
		this.nome = nome;
		this.idade = idade;
	}

	public int compareTo(Cat o) {
		return this.nome.compareTo(o.nome);
	}
	
	@Override
	public String toString() {
		return this.nome+" "+this.idade;
	}

	@Override
	public int hashCode() {
		final int prime = 31;
		int result = 1;
		result = prime * result + idade;
		result = prime * result + ((nome == null) ? 0 : nome.hashCode());
		return result;
	}

	@Override
	public boolean equals(Object obj) {
		if (this == obj)
			return true;
		if (obj == null)
			return false;
		if (getClass() != obj.getClass())
			return false;
		final Cat other = (Cat) obj;
		if (idade != other.idade)
			return false;
		if (nome == null) {
			if (other.nome != null)
				return false;
		} else if (!nome.equals(other.nome))
			return false;
		return true;
	}
}

Neste caso o TreeSet não insere o elemento, pois de acordo com a comparação de compareTo ele já existe (retorna 0)

Mas se por acaso eu modificar e deixar um pouco mais específico o compareTo

...
public int compareTo(Cat o) {
		return this.nome.compareTo(o.nome)+ Integer.valueOf(this.idade).compareTo(Integer.valueOf(o.idade));
	}
...

Ele insere pois ele não é mais único (do ponto de vista do compareTo) já que ele não retorna mais 0, neste caso a implementação de equals não tem nenhuma serventia.

O que vocês acham ?

O metodo compareTo da interface Comparable serve para colecoes(TreeSet) ordenadas.
O metodo equals serve para comparar dois objetos entre si.

A diferenca basica entre eles eh que o compareTo eh usado ao ordenar colecoes ou ao adicionar elementos a colecoes ordenas.

Espero ter ajudado. :smiley:

Pessoal para quem tiver curiosidade.
http://saloon.javaranch.com/cgi-bin/ubb/ultimatebb.cgi?ubb=get_topic&f=24&t=042979

Basicamente deve haver uma consistência entre equals e compareTo, para que não ocorra a bloqueio de um objeto que não existe na TreeMap e TreeSet.