Como comparar um arraylist em java



A interface List em Java fornece métodos para comparar duas listas e encontrar os itens comuns e ausentes nas listas.



Compare duas listas não classificadas para igualdade

Se você quiser verificar se duas listas são iguais, ou seja, contêm os mesmos itens e aparecem no mesmo índice, podemos usar:

import java.util.Arrays; import java.util.List; public class CompareTwoLists { public static void main(String[] args) { List listOne = Arrays.asList('a', 'b', 'c'); List listTwo = Arrays.asList('a', 'b', 'c'); List listThree = Arrays.asList('c', 'a', 'b');boolean isEqual = listOne.equals(listTwo); System.out.println(isEqual);isEqual = listOne.equals(listThree); System.out.println(isEqual);

} }

Resultado:


true false

Como você pode ver o equals() método compara os itens e sua localização na lista.

Relacionado:




Compare duas listas classificadas

Duas listas contêm os mesmos itens?



Para comparar duas listas de igualdade apenas em termos de itens, independentemente de sua localização, precisamos usar o sort() método do Collections() aula.

Por exemplo:

import java.util.Arrays; import java.util.Collections; import java.util.List; public class CompareTwoLists { public static void main(String[] args) { List listOne = Arrays.asList('b', 'c', 'a'); List listTwo = Arrays.asList('a', 'c', 'b'); List listThree = Arrays.asList('c', 'a', 'b');Collections.sort(listOne); Collections.sort(listTwo); Collections.sort(listThree);boolean isEqual = listOne.equals(listTwo); System.out.println(isEqual);isEqual = listOne.equals(listThree); System.out.println(isEqual);

} }

Resultado:


true true

Compare duas listas, encontre diferenças

O List interface também fornece métodos para encontrar diferenças entre duas listas.

O removeAll() método compara duas listas e remove todos os itens comuns. O que resta são os itens adicionais ou ausentes.

Por exemplo, quando comparamos duas listas, listOne e listTwo e queremos descobrir quais itens estão faltando em listTwo nós usamos:

import java.util.ArrayList; import java.util.Arrays; public class CompareTwoArrayLists { public static void main(String[] args) { ArrayList listOne = new ArrayList(Arrays.asList(1, 2, 3, 4, 5));ArrayList listTwo = new ArrayList(Arrays.asList(1, 2, 4, 5, 6, 7));listOne.removeAll(listTwo);System.out.println('Missing items from listTwo ' + listOne);

} }

Resultado:


Missing items from listTwo [3]

Da mesma forma, se usássemos:

listTwo.removeAll(listOne); System.out.println('Missing items from listOne ' + listTwo);

Nós obteríamos:

Missing items from listOne [6, 7]

Compare duas listas, encontre itens comuns

O retainAll() método mantém apenas os itens que são comuns em ambas as listas. Por exemplo:

public class CompareTwoArrayLists { public static void main(String[] args) { ArrayList listOne = new ArrayList(Arrays.asList(1, 2, 3, 4, 5));ArrayList listTwo = new ArrayList(Arrays.asList(1, 2, 4, 5, 6, 7));listOne.retainAll(listTwo);System.out.println('Common items in both lists ' + listOne);

} }

Resultado:


Common items in both lists [1, 2, 4, 5]

Java 8Object Oriented ProgrammingProgramming

You can compare two array lists using the equals() method of the ArrayList class, this method accepts a list object as a parameter, compares it with the current object, in case of the match it returns true and if not it returns false.

Example

 Live Demo

import java.util.ArrayList; public class ComparingList {    public static void main(String[] args) {       ArrayList<String> list1 = new ArrayList<String>();       list1.add("JavaFx");       list1.add("Java");       list1.add("WebGL");       list1.add("OpenCV");       ArrayList<String> list2 = new ArrayList<String>();       list2.add("JavaFx");       list2.add("Java");       list2.add("WebGL");       list2.add("OpenCV");       System.out.println(list2);       System.out.println(list1.equals(list2));    } }

Como comparar um arraylist em java

Published on 17-Jan-2018 06:32:41

Convert Lists to Collection and use removeAll

Collection<String> listOne = new ArrayList(Arrays.asList("a","b", "c", "d", "e", "f", "g")); Collection<String> listTwo = new ArrayList(Arrays.asList("a","b", "d", "e", "f", "gg", "h")); List<String> sourceList = new ArrayList<String>(listOne); List<String> destinationList = new ArrayList<String>(listTwo); sourceList.removeAll( listTwo ); destinationList.removeAll( listOne ); System.out.println( sourceList ); System.out.println( destinationList );

Output:

[c, g] [gg, h]

[EDIT]

other way (more clear)

Collection<String> list = new ArrayList(Arrays.asList("a","b", "c", "d", "e", "f", "g")); List<String> sourceList = new ArrayList<String>(list); List<String> destinationList = new ArrayList<String>(list); list.add("boo"); list.remove("b"); sourceList.removeAll( list ); list.removeAll( destinationList ); System.out.println( sourceList ); System.out.println( list );

Output:

[b] [boo]

Tenho duas listas que compartilham de um valor em comum entre elas. Eu queria que que esses objetos selecionados fossem filtrados para que ele seja adicionado em um outra lista

List<Objeto1> lista1 = new ListaElementos1().getElementos(); List<Objeto2> lista2 = new ListaElementos2().getElementos(); List<Objeto1> destino = new ArrayList<>(); for(Objeto1 item : lista1){ for(Objeto2 array: lista2){ if(array.getId() == item.getId()){ if(!destino.contains(item)){ destino.add(item); } } } }

Essa foi a forma que eu encontrei de fazer o filtro de forma que atendesse a minha necessidade. Porém eu não acho que essa é a melhor forma de fazer isso (por ter que rodar as duas listas inteiras para cada registro).

Existe alguma maneira de fazer isso sem a necessidade de criar 2 laços de repetição?

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?

Como comparar um arraylist em java

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

Como comparar um arraylist em java

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

Como comparar um arraylist em java

[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

próxima página →