Comparar dois ArrayList ?[RESOLVIDO]

Pessoal…

tenho dois arrayslist… e preciso comparar se os itens que neles são iguais…

alguma dica.

estou tentando fazer um for each dentro do outro…

vlw

Oi!

E com os for´s aninhados, não foi possível?
Ou simplesmente procuras uma solução mais elegante?

E por fim, que tipo de objeto está comparando?:slight_smile:

Olá, Rafael.

Como assim “iguais”?

Se são o mesmo objeto -> use apenas “.equals()”
Se possuem os mesmo elementos dentro -> use “removeAll([outra lista])”. Se sobrar alguma coisa dentro da primeira é porque não eram iguais.
Se possuem os mesmo elementos dentro e na mesma ordem -> Bem… essa eu resolveria com “for” mesmo :stuck_out_tongue:

Espero ter ajudado.

1 curtida

Assim:

arrayList.equals(otherArrayList);

Ele vai retornar verdadeiro se o objeto passado como parametro tambem for uma lista, de mesmo tamanho e se cada objeto da lista forem iguais (atraves do metodo equals de cada objeto) e estiverem dispostos na mesma ordem.

=D

referência: http://download.oracle.com/javase/6/docs/api/index.html

assim pessoal…


for(ItemNota item1: nota1.getItens()){

                item1.getValorProduto();
        
                for(ItemNota item2: nota2.getItens()){
                    itemNfe.getValorProduto();
                   

                    if(item1.getValorProduto().equals(item2.getValorProduto())){
                       
                        System.out.println("são iguais!");
                    }

                }

            }

tenho que comparar os valores dos itens de duas notas
para verificar se certo…igual…

se tiver implementado o metodo equals para os objetos que estiverem dentro do ArrayList nao precisa do for…

é só usar o equals do AbstractList que o ArrayList herda…

¬¬"

http://download.oracle.com/javase/6/docs/api/index.html

mas precisamos saber se as ordens das listas são iguais, ou se não sabes a ordem das mesmas ???

se forem exatamente na mesma ordem, não precisas de 2 fors, basta pegar o elemento da segunda lista com base no índice da 1ª.

Se forem diferentes, aí sim, terás que percorrer a segunda, até achar o item da primeira que está na iteração e comparar os valores.

Abs []

[quote=JM4X]se tiver implementado o metodo equals para os objetos que estiverem dentro do ArrayList nao precisa do for…

é só usar o equals do AbstractList que o ArrayList herda…

¬¬"

http://download.oracle.com/javase/6/docs/api/index.html[/quote]

Algo me diz que o equals não funciona para objetos como o dele, somente Wrappers.
No caso dele ele criou uma classe com determinados atributos e quer saber se os mesmo são iguais, o equals não vai rolar.

Só um detalhe, até funciona, mas ele teria que sobrescrever o método equals da classe criada por ele :slight_smile:

[quote=nel][quote=JM4X]se tiver implementado o metodo equals para os objetos que estiverem dentro do ArrayList nao precisa do for…

é só usar o equals do AbstractList que o ArrayList herda…

¬¬"

http://download.oracle.com/javase/6/docs/api/index.html[/quote]

Algo me diz que o equals não funciona para objetos como o dele, somente Wrappers.
No caso dele ele criou uma classe com determinados atributos e quer saber se os mesmo são iguais, o equals não vai rolar.[/quote]

quando o for passa na primeira vez ele pega os primeiro valores corretos e depois compara certinho…

porem, na segunda vez ele se perde, pegando trocado…

esses for estão certos?

tipo…não tem erro de lógica ai?

vlw

[quote=rafaelpiton][quote=nel][quote=JM4X]se tiver implementado o metodo equals para os objetos que estiverem dentro do ArrayList nao precisa do for…

é só usar o equals do AbstractList que o ArrayList herda…

¬¬"

http://download.oracle.com/javase/6/docs/api/index.html[/quote]

Algo me diz que o equals não funciona para objetos como o dele, somente Wrappers.
No caso dele ele criou uma classe com determinados atributos e quer saber se os mesmo são iguais, o equals não vai rolar.[/quote]

quando o for passa na primeira vez ele pega os primeiro valores corretos e depois compara certinho…

porem, na segunda vez ele se perde, pegando trocado…

esses for estão certos?

tipo…não tem erro de lógica ai?

vlw[/quote]

É como o JM4X explicou, os objetos precisam estar ordenados da mesma forma, caso contrário, não será válido.
Vamos supor que o Objeto da posição 0 é o mesmo da posição 10 da outra lista, vai dar false, quando na verdade, poderia ser true.
Sendo assim, para usar o equals da interface List, você precisa de duas etapas:

1 - Organizar ambas as listas da mesma forma (Podes criar uma classe que implementa o Comparator, depois o método sort() para organizar)
2 - Sobrescrever o método equals do seu objeto “Itemnota”

Fora isso, creio que somente for aninhados. De qualquer forma, aconselho fortemente a organizar as listas antes de compara-las.
Abraços.

[quote=adriano_si]mas precisamos saber se as ordens das listas são iguais, ou se não sabes a ordem das mesmas ???

se forem exatamente na mesma ordem, não precisas de 2 fors, basta pegar o elemento da segunda lista com base no índice da 1ª.

Se forem diferentes, aí sim, terás que percorrer a segunda, até achar o item da primeira que está na iteração e comparar os valores.

Abs [][/quote]

a ordem é o que vem do DB…

não é ordenada…

[quote=nel][quote=rafaelpiton][quote=nel][quote=JM4X]se tiver implementado o metodo equals para os objetos que estiverem dentro do ArrayList nao precisa do for…

é só usar o equals do AbstractList que o ArrayList herda…

¬¬"

http://download.oracle.com/javase/6/docs/api/index.html[/quote]

Algo me diz que o equals não funciona para objetos como o dele, somente Wrappers.
No caso dele ele criou uma classe com determinados atributos e quer saber se os mesmo são iguais, o equals não vai rolar.[/quote]

quando o for passa na primeira vez ele pega os primeiro valores corretos e depois compara certinho…

porem, na segunda vez ele se perde, pegando trocado…

esses for estão certos?

tipo…não tem erro de lógica ai?

vlw[/quote]

É como o JM4X explicou, os objetos precisam estar ordenados da mesma forma, caso contrário, não será válido.
Vamos supor que o Objeto da posição 0 é o mesmo da posição 10 da outra lista, vai dar false, quando na verdade, poderia ser true.
Sendo assim, para usar o equals da interface List, você precisa de duas etapas:

1 - Organizar ambas as listas da mesma forma (Podes criar uma classe que implementa o Comparator, depois o método sort() para organizar)
2 - Sobrescrever o método equals do seu objeto “Itemnota”

Fora isso, creio que somente for aninhados. De qualquer forma, aconselho fortemente a organizar as listas antes de compara-las.
Abraços.[/quote]

blz vlw…vou ver isso

Pelo que entendi então removeAll() resolve teu problema com poucas linhas, independente da ordem dos elementos.

[code]if (nota1.getItens().size()!=nota2.getItens().size())
return false; // não precisa testar mais nada. Se não possuem mesmo tamanho, são diferentes.

List listaTmp = new ArrayList();
listaTmp.addAll(nota1.getItens());
listaTmp.removeAll(nota2.getItens());
boolean eIgual = (listaTmp.size()==0);[/code]

Não apliquei o removeAll() direto na nota1.getItens() ou na nota2.getItens() por poder ter efeito colateral no restante do teu código.

[quote=nel]
Algo me diz que o equals não funciona para objetos como o dele, somente Wrappers.
No caso dele ele criou uma classe com determinados atributos e quer saber se os mesmo são iguais, o equals não vai rolar.[/quote]

Fala nel, parece-me que também não funciona com Strings…

Abs []

[quote=jyoshiriro]Pelo que entendi então removeAll() resolve teu problema com poucas linhas, independente da ordem dos elementos.

[code]if (nota1.getItens().size()!=nota2.getItens().size())
return false; // não precisa testar mais nada. Se não possuem mesmo tamanho, são diferentes.

List listaTmp = new ArrayList();
listaTmp.addAll(nota1.getItens());
listaTmp.removeAll(nota2.getItens());
boolean eIgual = (listaTmp.size()==0);[/code]

Não apliquei o removeAll() direto na nota1.getItens() ou na nota2.getItens() por poder ter efeito colateral no restante do teu código.[/quote]

cara mas se eu quiser saber o item que deu problema? tipo nesse getItens

tenho valor, quantidade…

digamos que o valor ficou diferente do outro…

entendeU?

vlw pela força!!

Bom… eu fiz um teste… não sei se a idéia foi correta, mas só funcionou iterando sobre as 2 listas:

package testesjava;

public class Pessoa {

    private int codigo;
    private String nome;

    public Pessoa(int codigo, String nome){
        this.codigo = codigo;
        this.nome = nome;
    }

    public int getCodigo() { return codigo; }

    public String getNome() { return nome; }

    public boolean equals(Object o) {
        Pessoa pc = (Pessoa) o;
        if(this.codigo == pc.getCodigo()){
            return true;
        }
        return false;
    }
}
Pessoa p1 = new Pessoa(1, "Adriano");
Pessoa p2 = new Pessoa(2, "Carlos");
Pessoa p3 = new Pessoa(3, "Alfredo");

List<Pessoa> l1 = new ArrayList<Pessoa>();
List<Pessoa> l2 = new ArrayList<Pessoa>();

l1.add(p1);
l1.add(p2);

l2.add(p3);
l2.add(p1);

for(Pessoa p : l1) // Aqui não funcionou, não sei se está certo a forma que usei, mas foi assim que entendi que era o uso
    if(l2.equals(p))
        System.out.println("O [" + p.getNome() + "] existe nas 2 listas");

for(Pessoa p : l1) // Aqui foi normal. Ou seja, como ele já estava fazendo.
    for(Pessoa pes : l2)
        if(p.equals(pes))
            System.out.println("O [" + p.getNome() + "] existe nas 2 listas");

Simples.

Os itens que sobrarem em listaTmp após o removeAll() representam os item diferentes de uma lista para outra.

esquece :{ inglês enferrujado é osso…

Relendo com calma, entendi… Precisa primeiro ordenar a lista ´pra depois validar se são iguais…

[quote=jyoshiriro]Simples.

Os itens que sobrarem em listaTmp após o removeAll() representam os item diferentes de uma lista para outra.[/quote]

Acho que resolve o seu problema não ??? agora resta saber se podes remover os elementos da 2ª lista…

PS: Yoshi, não tens vergonha de colocar uma foto dormindo em sala de aula ?? heuehue