Java ArrayList

PHP, Java, JavaScript, XML, XHTML, HTML, CSS, ASP, Delphi, Assembly, LaTeX, C, UML, Flash, Perl, SQL, Python, Zope, Pascal, WML. Se conhece mais de 3 siglas referidas, este é o forum para si.

Moderadores: Administradores, Moderadores

Java ArrayList

Mensagempor riapa » Sexta Abr 11, 2008 17:05

Boas!

Tenho duas listas, Lista A e Lista B, e queria passar para a lista B todos os objectos da A excepto os repetidos.
O problema é que parece que a função do java ListaA.contains(var) apenas compara o id de cada objecto e não os valores das suas variáveis.

É que os meus objectos têm todos ids diferentes, mas os seus valores, em alguns, são iguais...

Como é que me safo disto?:roll:

Nota: Estou a usar um for each.
Avatar do Utilizador
riapa
Membro Diamante
Membro Diamante
 
Mensagens: 1144
Registado: Terça Jan 03, 2006 18:23

Mensagempor vamosAeles » Sábado Abr 12, 2008 22:09

Boas, experimenta o metodo equals dos objectos em questão.
Para os mais conhecidos e usados tipo Strings, Numeros, Datas, etc, o equals compara o conteúdo (isto se forem do mesmo tipo). Se for uma classe definida por ti também podes fazer override do equals.

[[]]
vamosAeles
Membro de Prata
Membro de Prata
 
Mensagens: 206
Registado: Quarta Jan 04, 2006 21:29
Localização: Lisboa/Proença

Mensagempor alexin » Sábado Abr 12, 2008 22:26

Exactamente.
Já agora, dá uma vista de olhos à classe Collections, pode ser que tenha um método do teu interesse.
alexin
Aprendiz
Aprendiz
 
Mensagens: 40
Registado: Domingo Mar 09, 2008 18:38

Mensagempor riapa » Domingo Abr 13, 2008 13:06

Nada, parece que não compara...
Tenho uma ArrayList<Ponto> Pontos = new ArrayList<Pontos>();
Um ponto tem um x e um y: Ponto.x e Ponto.y

Na minha ArrayList Pontos existem alguns que são iguais, ou seja, têm o mesmo x e y e queria apagar esses. É claro que os seus ids são diferentes...

O contains ou o equals não funciona, parece que só liga ao id e não ao valor que têm cada objecto ponto.

O que poderá ser? :roll:
Avatar do Utilizador
riapa
Membro Diamante
Membro Diamante
 
Mensagens: 1144
Registado: Terça Jan 03, 2006 18:23

Mensagempor alexin » Domingo Abr 13, 2008 16:53

Código: Seleccionar todos
public class Ponto {
   
    //      (...)

    @Override
    public boolean equals(Object o) {
        if(!(o instanceof Ponto)){
            throw new IllegalArgumentException();
        }
        return (this.x ==((Ponto)o).x) && (this.y ==((Ponto)o).y);
    }
}


Percorre a lista, compara os elementos e remove os que devolverem TRUE no equals().
Se não conseguires mostra-nos o código que estás a utilizar.
alexin
Aprendiz
Aprendiz
 
Mensagens: 40
Registado: Domingo Mar 09, 2008 18:38

Mensagempor riapa » Domingo Abr 13, 2008 19:00

Grande ideia essa do override, não tinha pensado nisso. Mas acho que o meu problema é mesmo na construção dos meus ciclos.

Temos:
:arrow:Fraction = fracção. Tal como um Ponto x y » num den...
:arrow:Cantor é a ArrayList onde estão todas as Fractions; FinalCantor será o Array que irá conter todas as Fractions de Cantor, excepto as repetidas.

Código: Seleccionar todos
ArrayList<Fraction> FinalCantor = new ArrayList<Fraction>();
FinalCantor.add(this.Cantor.get(0));
       
        for(Fraction A : this.Cantor)
        {
            for(Fraction B : FinalCantor)
            {
                if(A.equals(B) == false)
                {
                    FinalCantor.add(A);
                    break;
                }
            }
        }   


Acho que o meu problema é que ele não está a percorrer o Array FinalCantor todo e a ver se já lá existe uma valor igual. Ele foca-se sempre no primeiro Fraction B... O que faz algum sentido, ele compara o primeiro do FinalCantor com o A do Cantor e como é sempre dif adiciona... Eu quero que ele precorra o FinalCantor todo, e se realmente não existir lá, então adiciona-o.
Como é que dou a volta a isto?
Avatar do Utilizador
riapa
Membro Diamante
Membro Diamante
 
Mensagens: 1144
Registado: Terça Jan 03, 2006 18:23

Mensagempor alexin » Domingo Abr 13, 2008 19:19

riapa Escreveu:Grande ideia essa do override, não tinha pensado nisso.

O vamosAeles já tinha falado nisso...

Se bem percebi é isto que tu queres:
Código: Seleccionar todos
ArrayList<Fraction> finalCantor = new ArrayList<Fraction>();
            for(Fraction f : cantor){
                if(!finalCantor.contains(f)){
                    finalCantor.add(f);
                }
            }


O método contains() utiliza o equals() da classe Fraction para comparar os objectos em questão. Se o 'f' ainda não estiver em 'finalCantor' então adiciona-o. No final tens uma lista com elementos "únicos".
alexin
Aprendiz
Aprendiz
 
Mensagens: 40
Registado: Domingo Mar 09, 2008 18:38

Mensagempor riapa » Domingo Abr 13, 2008 21:51

Epah é isso mesmo! Grande alexin e vamosAeles! ;)
Obrigado aos dois.

A solução é de facto simples, mas não me passou pela cabeça. Já aprendi 1s coisinhas eheh

Obrigado um vez mais! ;)
Avatar do Utilizador
riapa
Membro Diamante
Membro Diamante
 
Mensagens: 1144
Registado: Terça Jan 03, 2006 18:23


Voltar para Programação

Quem está ligado:

Utilizadores a ver este Fórum: Nenhum utilizador registado e 0 visitantes

cron