Comparar dois ArrayList ?[RESOLVIDO]

Pois é… por isso sugeri a criação de uma lista temporária. Inicialmente ela recebe o conteúdo integral de uma das listas e depois os itens são removidos dela e não da original.

É que sou dorminhoco… meu apelido na faculdade era “Garfield”. Essa foto reflete a realidade rsrsrsr

[quote=jyoshiriro]Simples.

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

cara…
não sei se estou fazendo errado…

mas dei um print do listaTmp e ele remove tudo da nota2

Amigo, você deve invocar removeAll() no listaTemp. Não tem como isso remover itens de nota2.

A não ser que você tenha feito

listaTemp = nota2.getItens();

Isso tá errado. Deveria ser

listaTemp.addAll(nota2.getItens());  // ou nota1.getItens(), tanto faz.

Olha esse código que fiz agora:
[code]List l1 = new ArrayList();
List l2 = new ArrayList();

	l1.add("oi");
	l1.add("olá");
	l1.add("boa tarde");

	l2.add("oi");
	l2.add("olá");
	
	List lt = new ArrayList();
	lt.addAll(l1);
	
	lt.removeAll(l2);
	
	System.out.println(l1);
	System.out.println(l2);
	System.out.println(lt);[/code]

A saída foi

[oi, olá, boa tarde]
[oi, olá]
[boa tarde]

[quote=jyoshiriro]Amigo, você deve invocar removeAll() no listaTemp. Não tem como isso remover itens de nota2.

A não ser que você tenha feito

listaTemp = nota2.getItens();

Isso tá errado. Deveria ser

listaTemp.addAll(nota2.getItens());  // ou nota1.getItens(), tanto faz.

Olha esse código que fiz agora:
[code]List l1 = new ArrayList();
List l2 = new ArrayList();

	l1.add("oi");
	l1.add("olá");
	l1.add("boa tarde");

	l2.add("oi");
	l2.add("olá");
	
	List lt = new ArrayList();
	lt.addAll(l1);
	
	lt.removeAll(l2);
	
	System.out.println(l1);
	System.out.println(l2);
	System.out.println(lt);[/code]

A saída foi

[oi, olá, boa tarde]
[oi, olá]
[boa tarde]
[/quote]

Opa…

eu to fazendo assim o:


                List listaTmp = new ArrayList();

                listaTmp.addAll(nota1.getItens());

                listaTmp.removeAll(nota2.getItens());

                System.out.println("nota1:"+nota1.getItens());
                System.out.println("nota2:"+nota2.getItens());
                System.out.println("lista final:"+listaTmp);

porem no meu a saída é:

[b]
nota1:valorProduto: 15.15 QTD: 400.0,
valorProduto: 55113.08 QTD: 7139.0]

notanfe:valorProduto: 8.1 QTD: 400.0,
valorProduto: 55113.08 QTD: 7139.0

lista final:valorProduto: 8.1 QTD: 400.0,
valorProduto: 55113.08 QTD: 7139.0[/b]

tipo não era para aparecer só o valorProduto: 15.15 ?

[quote=rafaelpiton][quote=jyoshiriro]Amigo, você deve invocar removeAll() no listaTemp. Não tem como isso remover itens de nota2.

A não ser que você tenha feito

listaTemp = nota2.getItens();

Isso tá errado. Deveria ser

listaTemp.addAll(nota2.getItens());  // ou nota1.getItens(), tanto faz.

Olha esse código que fiz agora:
[code]List l1 = new ArrayList();
List l2 = new ArrayList();

	l1.add("oi");
	l1.add("olá");
	l1.add("boa tarde");

	l2.add("oi");
	l2.add("olá");
	
	List lt = new ArrayList();
	lt.addAll(l1);
	
	lt.removeAll(l2);
	
	System.out.println(l1);
	System.out.println(l2);
	System.out.println(lt);[/code]

A saída foi

[oi, olá, boa tarde]
[oi, olá]
[boa tarde]
[/quote]

Opa…

eu to fazendo assim o:


                List listaTmp = new ArrayList();

                listaTmp.addAll(nota1.getItens());

                listaTmp.removeAll(nota2.getItens());

                System.out.println("nota1:"+nota1.getItens());
                System.out.println("nota2:"+nota2.getItens());
                System.out.println("lista final:"+listaTmp);

porem no meu a saída é:

[b]
nota1:valorProduto: 15.15 QTD: 400.0,
valorProduto: 55113.08 QTD: 7139.0]

nota2:valorProduto: 8.1 QTD: 400.0,
valorProduto: 55113.08 QTD: 7139.0

lista final:valorProduto: 8.1 QTD: 400.0,
valorProduto: 55113.08 QTD: 7139.0[/b]

tipo não era para aparecer só o valorProduto: 15.15 ?

como vou saber qual item ficou diferente?

tipo, ListaTmp.get…alguma coisa?

[/quote]

Realmente, por essas saídas que você mostrou algo está errado.
Você sobrescreveu o método “equals()” da classe de onde tira os “getItens()”?

E tem certeza que o código que colou no teu post está 100% igual ao que você compilou e testou?

[quote=jyoshiriro]Realmente, por essas saídas que você mostrou algo está errado.
Você sobrescreveu o método “equals()” da classe de onde tira os “getItens()”?

E tem certeza que o código que colou no teu post está 100% igual ao que você compilou e testou? [/quote]

cara…

não sobrescrevi o método equals…

e o código é esse…

:C

[quote=rafaelpiton][quote=jyoshiriro]Realmente, por essas saídas que você mostrou algo está errado.
Você sobrescreveu o método “equals()” da classe de onde tira os “getItens()”?

E tem certeza que o código que colou no teu post está 100% igual ao que você compilou e testou? [/quote]

cara…

não sobrescrevi o método equals…

e o código é esse…

:C[/quote]

Então, sobrescreva o equals amigo, ai vai funcionar :slight_smile:

O que me deixou “com a pulga atrás da orelha” foi que você adicionou todos os itens de nota1 à listaTemp depois pediu aplicou um removeAll() em listaTemp passando como parâmetro a nota2. No fim o conteúdo que sobra na listaTemp é o mesmo conteúdo da nota2. Isso é digamos… impossível rsrsrs.
O método [b]removeAll/b, segundo seu relato, simplesmente substituiu itens de uma coleção e isso é impossível em condições normais. A não ser que esteja rolando uma Thread que fica alterando os itens da lista… única explicação e olhe lá.
Por isso te perguntei se o código era esse mesmo do post.

[quote=nel][quote=rafaelpiton][quote=jyoshiriro]Realmente, por essas saídas que você mostrou algo está errado.
Você sobrescreveu o método “equals()” da classe de onde tira os “getItens()”?

E tem certeza que o código que colou no teu post está 100% igual ao que você compilou e testou? [/quote]

cara…

não sobrescrevi o método equals…

e o código é esse…

:C[/quote]

Então, sobrescreva o equals amigo, ai vai funcionar :)[/quote]

cara…não leva a mau…

mas como sobrescrevo o equals…

assim?

public String equals(){

}

Já sei! Tive uma ideia: Acredito que o problema esteja nos métodos “getItens()” de suas “nota1” e “nota2”.

Como está o corpo desse método?

Amigo, recomendo fortemente que não sobrescreva o equals(). Isso só se faz em casos bem específicos mesmo e não me parece o caso.

[quote=jyoshiriro]Já sei! Tive uma ideia: Acredito que o problema esteja nos métodos “getItens()” de suas “nota1” e “nota2”.

Como está o corpo desse método?

Amigo, recomendo fortemente que não sobrescreva o equals(). Isso só se faz em casos bem específicos mesmo e não me parece o caso.

[/quote]

ok…

cara…ta assim

tenho uma classe nota
e uma classe item

na classe nota coloco List itens

e getters setters…

e quando instancio um objeto atribuo os valores dos itens…


 public List<ItemNota> getItens() {
        return itens;
    }

    public void setItens(List<ItemNota> itens) {
        this.itens = itens;
    }

Amigo, tem alguma coisa passando batida no teu código…

Olha esse código que fiz agora:

[code]public class TesteListas {

/**
 * @param args
 */
public static void main(String[] args) {
	List<ItemNota> l1 = new ArrayList();
	List<ItemNota> l2 = new ArrayList();
	
	ItemNota in1 = new ItemNota("Abacaxi",10.0);
	ItemNota in2 = new ItemNota("Laranja",8.0);
	ItemNota in3 = new ItemNota("Tomate",4.0);
	
	l1.add(in1);
	l1.add(in2);
	l1.add(in3);

	l2.add(in1);
	l2.add(in2);
	
	Nota nota1 = new Nota();
	nota1.setItens(l1);
	
	Nota nota2 = new Nota();
	nota2.setItens(l2);
	
	List lt = new ArrayList();
	lt.addAll(nota1.getItens());
	
	lt.removeAll(nota2.getItens());
	
	System.out.println("lista1: "+nota1.getItens());
	System.out.println("lista2: "+nota2.getItens());
	System.out.println("listatemp: "+lt);
	
}

}

class ItemNota {
String nome;
Double valor;
public ItemNota(String nome, Double valor) {
super();
this.nome = nome;
this.valor = valor;
}
@Override
public String toString() {
return nome+" - "+valor;
}
}

class Nota {
List itens;

public List<ItemNota> getItens() {
	return itens;
}

public void setItens(List<ItemNota> itens) {
	this.itens = itens;
}

}[/code]
E a saída foi:

lista1: [Abacaxi - 10.0, Laranja - 8.0, Tomate - 4.0]
lista2: [Abacaxi - 10.0, Laranja - 8.0]
listatemp: [Tomate - 4.0]

Era algo assim que deveria acontecer no teu código. Mas, pelo teu relato, o conteúdo da lista temporária foi substituído! Increcrible! rsrsrs

O que parece é que, na verdade, teu código parece ser:

listaTmp.addAll(nota2.getItens()); // nota2 e não nota1 listaTmp.removeAll(nota1.getItens()); // nota1 e não nota2
É a única maneira de a saída ter ficado como ficou.

Oi!

Como já dei minha sugestão, encerro por aqui dizendo que provavelmente o problema está na forma de como está trabalhando com a referência dos objetos.
Se alterar uma referência, mesmo que o objeto esteja contido em uma lista, esse objeto sofrerá as mesmas alterações, tenha cuidado com isso.

Sobre o equals(), vejo que esse é um caso específico sim, pois ele precisa comparar o objeto dele, creio que isso centralizaria o seu problema.
Mas enfim, opinião foi dada.

Abraços amigo!

bopm Yoshi, fiz o seguinte teste:

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

        ItemNota in1 = new ItemNota("Abacaxi",10.0);
        ItemNota in2 = new ItemNota("Laranja",8.0);
        ItemNota in3 = new ItemNota("Tomate",4.0);

        ItemNota in4 = new ItemNota("Abacaxi",10.0);
        ItemNota in5 = new ItemNota("Laranja",8.0);

        l1.add(in1);
        l1.add(in2);
        l1.add(in3);

        l2.add(in4);
        l2.add(in5);

        Nota nota1 = new Nota();
        nota1.setItens(l1);

        Nota nota2 = new Nota();
        nota2.setItens(l2);

        List lt = new ArrayList();
        lt.addAll(nota1.getItens());

        lt.removeAll(nota2.getItens());

        System.out.println("lista1: "+nota1.getItens());
        System.out.println("lista2: "+nota2.getItens());
        System.out.println("listatemp: "+lt);

Aí o resultado foi diferente pois não apontava para o mesmo objeto, de repente está sendo feita 2 consultas que faz com que os objetos ItemNota dele sejam diferentes… Aí pra funcionar seu código tive que fazer na classe ItemNota

public boolean equals(Object o){
        ItemNota in = (ItemNota) o;
        if(this.nome.equals(in.nome) && this.valor.equals(in.valor))
            return true;
        return false;
    }

Enfim, deve ser alterado pra sua realidade… Acho que é o único motivo pelo qual o removeAll não está excluindo os itens da lista 2… A menos que não sejam 2 consultas e o fato de inverter

listaTmp.addAll(nota2.getItens());  // nota2 e não nota1   
listaTmp.removeAll(nota1.getItens());    // nota1 e não nota2  

realmente funcione.

espero ter ajudado.

Abs []

Oi,

Você precisa comparar os elementos deste array para qual objetivo? Remove-los? Tornar apenas 1 só lista com os números iguais?

Tchauzin!

Pois é, Adriano, eu entendi sua colocação.

Mas a questão é como ele preenche essas listas antes de comparar seus conteúdos.

Se preenche via ORM (hibernate, jpa, etc) os objetos ficam com a mesma referência em memória quando originados do mesmo objeto gerenciado (Session ou EntityManager), mesmo que vindos de consultas diferentes.

Se o caso do nosso amigo for comparar realmente o conteúdo de cada ItemNota, nesse caso tem que sobrescrever os equals() e o hashCode(), infelizmente.

[quote=adriano_si]bopm Yoshi, fiz o seguinte teste:

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

        ItemNota in1 = new ItemNota("Abacaxi",10.0);
        ItemNota in2 = new ItemNota("Laranja",8.0);
        ItemNota in3 = new ItemNota("Tomate",4.0);

        ItemNota in4 = new ItemNota("Abacaxi",10.0);
        ItemNota in5 = new ItemNota("Laranja",8.0);

        l1.add(in1);
        l1.add(in2);
        l1.add(in3);

        l2.add(in4);
        l2.add(in5);

        Nota nota1 = new Nota();
        nota1.setItens(l1);

        Nota nota2 = new Nota();
        nota2.setItens(l2);

        List lt = new ArrayList();
        lt.addAll(nota1.getItens());

        lt.removeAll(nota2.getItens());

        System.out.println("lista1: "+nota1.getItens());
        System.out.println("lista2: "+nota2.getItens());
        System.out.println("listatemp: "+lt);

Aí o resultado foi diferente pois não apontava para o mesmo objeto, de repente está sendo feita 2 consultas que faz com que os objetos ItemNota dele sejam diferentes… Aí pra funcionar seu código tive que fazer na classe ItemNota

public boolean equals(Object o){
        ItemNota in = (ItemNota) o;
        if(this.nome.equals(in.nome) && this.valor.equals(in.valor))
            return true;
        return false;
    }

Enfim, deve ser alterado pra sua realidade… Acho que é o único motivo pelo qual o removeAll não está excluindo os itens da lista 2… A menos que não sejam 2 consultas e o fato de inverter

listaTmp.addAll(nota2.getItens());  // nota2 e não nota1   
listaTmp.removeAll(nota1.getItens());    // nota1 e não nota2  

realmente funcione.

espero ter ajudado.

Abs [][/quote]

Eai adriano_si e bopm Yosh,

fiz isso e funcionou…\O/

agora ele me mostra só o valor diferente!

Mas o engraçado é que não consegui da outra maneira…mas pessoal

agradeço ai pela tarde de ajuda!

Vlw mesmo! abraço!

[quote=lina]Oi,

Você precisa comparar os elementos deste array para qual objetivo? Remove-los? Tornar apenas 1 só lista com os números iguais?

Tchauzin![/quote]

cara preciso comparar para isso…para saber quais itens não estão iguais…

pegar os itens que nao sao iguais e enviar por email por exemplo…