Inserir objeto em um TreeSet

9 respostas
H

Pessoal eu tenho uma classe entidade que quero inserir em um TreeSet para deixa-las organizadas em order crescente. Bom, nessa classe eu já substituí o toString() e o equals() e quando eu tento inserir essa classe em uma coleção TreeSet dá erro de Cast, o que pode estar havendo?

public class Tela
{
	private Integer id;

	private String nome;
	
public Tela(Integer id, String nome)
{
this.id = id;
this.nome = nome;
}

	public Integer getId()
	{
		return id;
	}

	public void setId(Integer id)
	{
		this.id = id;
	}

	public String getNome()
	{
		return nome;
	}

	public void setNome(String nome)
	{
		this.nome = nome;
	}
	
	public String toString()
	{
		return this.nome;
	}
	
	public boolean equals(Object o)
	{
		if(this.id == ((Tela)o).getId())
		{
			return true;
		}
		else
		{
			return false;
		}
	}

E tento inserir o objeto na coleção da seguinte forma:

Set subLinks = new TreeSet();

subLinks.add(new Tela(new Integer(1), "A Teste"));

subLinks.add(new Tela(new Integer(2), "C Teste"));

subLinks.add(new Tela(new Integer(3), "B Teste"));

9 Respostas

T

TreeSet requer que o objeto seja uma instância de uma classe que implemente Comparable. No seu caso, supondo que sua TreeSet fique ordenada pela ordem crescente de ID, e se duas Telas tiverem o mesmo ID, que sejam ordenadas então por nome, e que você não tenha nenhum elemento cujo id seja null ou nome seja null:
EDIT - esqueci de pôr “implements Comparable” :oops:

public class Tela implements Comparable {
    private Integer id;
    private String nome;
    public int compareTo (Object o) {
        Tela t = (Tela) o;
        if (t == this) return 0;
        int ret = id.compareTo (t.getId());
        if (ret != 0) return ret;
        ret = nome.compareTo (t.getNome());
        return ret;
    }
    ...
dudaskank

vc deve, ao invés de sobrescrever o equals, implementar a interface Comparable com seu método compareTo:

public int compareTo(Object o) { return id.compareTo(((Tela) o).getId()); }

H

Humm… Legal ! Obrigado Amigo!

H

Agora que deu certo fazer a ordem crescente preciso fazer a order decrescente…

T

Você inverte o sinal - se compareTo retorna +1, você pondo o sinal de - vai retornar -1. Só que como uma classe não pode implementar Comparable duas vezes, você precisa criar uma classe auxiliar que implementa Comparator e passar uma instância dessa classe para o TreeSet no seu construtor.

public class ExemploComparator implements Comparator {
     public int compare (Object o1, Object o2) {
         Tela t1 = (Tela) o1;
         Tela t2 = (Tela) o2;
         int ret = - t1.getId().compareTo(t2.getId());
         if (ret != 0) return ret;
         ret = - t1.getNome().compareTo(t2.getNome());
         return ret;
     }
     }
H

Na verdade minha ordenação é somente pelo Nome, então eu fiz um Comparator da seguinte forma:

public class Decreasing implements Comparator 
{
	public int compare(Object o1, Object o2)
	{
		return ((Tela) o2).compareTo(o1);
	}
}

Ele funciona uma exceção quando eu tenho um nome com ascentuação ele coloca esse nome na última posição, veja o exemplo da lista:

Unidade Federal
Logradouro Tipo
Logradouro
Bairro
País

nesse caso a palavra País deveria ser a primeira… o ocorre quando existe caracteres ascentuados em uma ordenação, como posso corrigir isso?

T

Hum - no meu alfabeto, a letra L vem antes da letra P e a letra P vem antes da letra U. Mas de qualquer maneira, existe o tal do Collator, que compara sem acentos.

H

Ops… País deverá vir depois Unidade Federal e antes de Logradouro Tipo.

Mas enfim… vou verificar o Collator!

Obrigado!

T

Eis um exemplo de como usar Collator. Cuidado que um “collator” é um objeto que é muito custoso de ser criado. Neste caso em particular eu o criei fora do método “compare”.

import java.util.*;
import java.text.*;

class ExemploCollator {
    public static void main(String[] args) {
        String[] dados = {
            "José Aparecido",
            "João Simões",
            "Jó Abedenego"
        };
        // Não usando "collator"
        SortedSet<String> s1 = new TreeSet<String>();
        for (String d : dados) {
            s1.add (d);
        }
        // Deve imprimir [José Aparecido, João Simões, Jó Abedenego], que é 
        // ao contrário das regras da língua portuguesa
        System.out.println (s1);
        // Usando "collator", segue as regras:
        // imprime "[Jó Abedenego, João Simões, José Aparecido]"
        final Collator coll = Collator.getInstance (new Locale ("pt", "BR"));
        SortedSet<String> s2 = new TreeSet<String>(new Comparator<String>() {
            public int compare (String o1, String o2) {
                return coll.compare (o1, o2);
            }
        });
        for (String d : dados) {
            s2.add (d);
        }
        System.out.println (s2);
    }
}
Criado 20 de julho de 2006
Ultima resposta 20 de jul. de 2006
Respostas 9
Participantes 3