Jump to content
mmcorrelo_LESI

Comparar dois treeSet

Recommended Posts

mmcorrelo_LESI

Olá, boa noite!!

O meu problema é:  comparar dois treeMaps.

Dúvidas:

- Preciso usar algum comparator? (axo faz todo sentido ordenar a insercao para depois comparar)

- depois uso dois iterator's para cada treeMap?

Os treeSet são da propria class e do object passado pelo parametro do method equals.

Mais simplificando,

a = this. getESubsPassageiros();

b = c. getESubsPassageiros();

Gostaria que me dessem a sugestões da maneira mais correcta de implemantar esta comparação. Obrigado!!

public boolean equals(Object o){
        if(o==this) return true;
        if((o==null) || (o.getClass()!=this.getClass())) return false;
        
        int i=0;
        boolean flag = super.equals(o);
        Comercial c = (Comercial) o;
        if(this.getESubsPassageiros().size()!=c.getESubsPassageiros().size())
            return false;
//         for(Passageiro p: c.getESubsPassageiros()){ //este algoritmo totalmente incorrecto, a ordem dos elementos n é igual
//             if(!(p.equals(this.getESubsPassageiros().get(i)))) <--- isto n funciona metodo n existente em treeSet
//                 return false;
//             i++;    
//         }
        return flag;
    }

Share this post


Link to post
Share on other sites
Baderous

Não precisas de estar a fazer essas verificações todas à mão. A interface Set providencia uma implementação do método equals que verifica se os elementos a comparar são ambos um Set, se têm o mesmo tamanho e se têm os mesmos elementos:

Compares the specified object with this set for equality. Returns true if the specified object is also a set, the two sets have the same size, and every member of the specified set is contained in this set (or equivalently, every member of this set is contained in the specified set). This definition ensures that the equals method works properly across different implementations of the set interface.

http://download.oracle.com/javase/6/docs/api/java/util/Set.html#equals%28java.lang.Object%29

Daí que baste invocar o equals para os TreeSet (depois de fazeres as 2 primeiras verificações que tens no teu método):

TreeSet<Integer> ts1 = new TreeSet<Integer>();
ts1.add(13);
ts1.add(2);
TreeSet<Integer> ts2 = new TreeSet<Integer>();
ts2.add(1);
ts2.add(2);
System.out.println(ts1.equals(ts2));

Share this post


Link to post
Share on other sites
mmcorrelo_LESI

Sim. Mas só funciona com tipo simples. Se tens uma collection com um tipo "composto", uma class. Penso que n funcione. A n ser k a implementação base dos sets trabalhe bit a bit. O k seria fantastico. De qualquer das maneiras vou tentar.

Desde já, obrigado!!!

Share this post


Link to post
Share on other sites
Baderous

Funciona desde que a classe em questão implemente o método equals:

public class Pessoa {
        private int idade;
        private String nome;

        public Pessoa() { this(0,""); }
        public Pessoa(int i, String n) { this.idade=i; this.nome=n; }
        public Pessoa(Pessoa p) {
                this.idade=p.getIdade();
                this.nome=p.getNome();
        }

        public int getIdade() { return this.idade; }
        public void setIdade(int n) { this.idade=n; }

        public String getNome() { return this.nome; }
        public void setNome(String n) { this.nome=n; }

        public boolean equals(Object o) {
                if (this==o) return true;
                if ((o==null) || (this.getClass()!=o.getClass())) return false;
                Pessoa p = (Pessoa)o;
                return this.idade==p.getIdade() && this.nome.equals(p.getNome());
        }
}

import java.util.*;

public class PessoaComparator implements Comparator<Pessoa> {
        public int compare(Pessoa p1, Pessoa p2) {
                if (p1.getIdade()>p2.getIdade()) return 1;
                if (p1.getIdade()<p2.getIdade()) return -1;
                else return 0;
        }
}

import java.util.*;

public class Cenas {
        public static void main(String[] args) {
                TreeSet<Pessoa> ts1 = new TreeSet<Pessoa>(new PessoaComparator());
                TreeSet<Pessoa> ts2 = new TreeSet<Pessoa>(new PessoaComparator());
                ts1.add(new Pessoa(3,"pedro"));
                ts1.add(new Pessoa(2333,"joana"));
                ts2.add(new Pessoa(3,"pedro"));
                ts2.add(new Pessoa(2,"joana"));
                System.out.println(ts1.equals(ts2));
        }
}

java -cp . Cenas
false

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now

×
×
  • Create New...

Important Information

By using this site you accept our Terms of Use and Privacy Policy. We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.