Comparar dois ArrayList ?[RESOLVIDO]

43 respostas
rafaelpiton

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

43 Respostas

nel

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:

jyoshiriro

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.

JM4X

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

rafaelpiton

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…

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

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 []

nel

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

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.

nel

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

rafaelpiton

nel:
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

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.

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

nel

rafaelpiton:
nel:
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

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.

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

É 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.

rafaelpiton

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 []

a ordem é o que vem do DB…

não é ordenada…

rafaelpiton

nel:
rafaelpiton:
nel:
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

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.

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

É 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.

blz vlw…vou ver isso

jyoshiriro

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

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);

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

adriano_si

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.

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

Abs []

rafaelpiton
jyoshiriro:
Pelo que entendi então removeAll() resolve teu problema com poucas linhas, independente da ordem dos elementos.
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);

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

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!!

adriano_si

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");
jyoshiriro

Simples.

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

adriano_si

esquece :{ inglês enferrujado é osso…

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

adriano_si

jyoshiriro:
Simples.

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

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

jyoshiriro

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

rafaelpiton

jyoshiriro:
Simples.

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

cara…
não sei se estou fazendo errado…

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

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:
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);

A saída foi

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

rafaelpiton
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:
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);

A saída foi

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

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 é:


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

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

rafaelpiton
rafaelpiton:
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:
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);

A saída foi

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

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 é:


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

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

como vou saber qual item ficou diferente?

tipo, ListaTmp.get.....alguma coisa?

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?

rafaelpiton

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?

cara…

não sobrescrevi o método equals…

e o código é esse…

:C

nel

rafaelpiton:
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?

cara…

não sobrescrevi o método equals…

e o código é esse…

:C

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

jyoshiriro

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.

rafaelpiton

nel:
rafaelpiton:
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?

cara…

não sobrescrevi o método equals…

e o código é esse…

:C

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

cara…não leva a mau…

mas como sobrescrevo o equals…

assim?

public String equals(){

}

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.

rafaelpiton

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.

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;
    }
jyoshiriro

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

Olha esse código que fiz agora:
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<ItemNota> itens;

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

	public void setItens(List<ItemNota> itens) {
		this.itens = itens;
	}
}
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

jyoshiriro

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.

nel

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!

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 []

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!

jyoshiriro

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.

rafaelpiton

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 []

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!

rafaelpiton

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!

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…

lina
rafaelpiton:
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!

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....

Oi,

Pois é rapaz... estava aqui pensando pq não usar removeAll(Collection).

ArrayList
teste = new ArrayList();
teste.add("Lina");
teste.add("Ferreira");
teste.add("OK");
		
ArrayList
teste1 = new ArrayList();
teste1.add("Lina");
teste1.add("Ferreira");
		
teste.removeAll(teste1);
		
for	(int ln = 0; ln < teste.size(); ln++)
	System.out.println(teste.get(ln));

Só que a dúvida já foi respondida!

Tchauzin!

adriano_si

Rafael, qual foi a solução afinal ???

Temos 2 soluções no Post que você copiou,a minha iria se referir se estivesse retornando 2 consultas diferentes (sem usar ORM como já identificou o Yoshi) e a outra, é a mesma solução que o Yoashi deu, porém invertendo qual lista removia de qual, ou seja, mesmo sendo consultas diferentes as listas estavam referenciandos os mesmos objetos…

Abs []

rafaelpiton

Opa…

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

Fiz isso e resolveu o problema.

vlw

danilocmiranda

@rafaelpiton

Você não deve sobescrever somente o equals mas também o hashCode.

É muito importante entender os conceitos primários de igualdade em Java para podermos seguir adiante e utilizar com mais conforto o JAVA COLLECTIONS FRAMEWORK.
Este slide-show é muito bom e explica bem estes conceitos:

http://www.slideshare.net/elenilsonvieira/java-collections-tomaz-lavieri

Espero que o ajude assim como me ajudou.

Grande abraço!

Criado 31 de maio de 2011
Ultima resposta 3 de jun. de 2011
Respostas 43
Participantes 7