descubra os elementos de um arraylist que não esteja presente em outro arraylist

Eu tenho que encontrar a melhor maneira de descobrir que elementos não são apresentados no segundo arraylist. suponha

Arraylist a,b, Arraylist a={1,2,3,4,5}; Arraylist b={2,3,4}; 

Então, basicamente, o que eu quero é descobrir que elementos de um que não está presente em arraylist b .

Então, quais são as melhores soluções para fazer isso?

 List c = new ArrayList<>(a); c.removeAll(b); 

Considere também usar conjuntos em vez de listas.

Você pode tentar removeAll :

 List notPresent = new ArrayList(a); notPresent.removeAll(b); 

Você pode usar o Apache Commons Collections , que tem um método explicitamente para essa finalidade:

 public static void main(String[] args) { List a = Arrays.asList(new Integer[] { 1, 2, 3, 4, 5 }); List b = Arrays.asList(new Integer[] { 2, 3, 4 }); Collection aMinusB = CollectionUtils.subtract(a, b); System.out.println(aMinusB); } 

O resultado impresso é: [1, 5] .

As bibliotecas do Apache Commons são bem testadas e comumente usadas para estender as funcionalidades padrão do Java. Esse método específico aceita Iterable como parâmetros, portanto, você pode usar qualquer Collection desejada. Você também pode misturar diferentes tipos de coleção:

 public static void main(String[] args) { List a = Arrays.asList(new Integer[] { 1, 2, 3, 4, 5 }); Set b = new HashSet(Arrays.asList(new Integer[] { 2, 3, 4 })); Collection aMinusB = CollectionUtils.subtract(a, b); System.out.println(aMinusB); } 

O resultado impresso é o mesmo, [1, 5] .

Confira o Javadoc aqui .


Para completar, a biblioteca Guava do Google não tem esse recurso :

Collection *subtract*(Collection, Collection)
Não equivalente – crie uma ArrayList contendo a e, em seguida, chame a remoção para cada elemento em b.

No entanto, ele implementa um método chamado método Sets.difference() , que você poderia usar se preferir o Guava e trabalhar com conjuntos:

 public static void main(String[] args) { Set a = new HashSet(Arrays.asList(new Integer[] { 1, 2, 3, 4, 5 })); Set b = new HashSet(Arrays.asList(new Integer[] { 2, 3, 4 })); Set aMinusB = Sets.difference(a, b); System.out.println(aMinusB); } 

O resultado é todos os elementos em a que não existe em b (ie [1, 5] novamente). Naturalmente, a ordem não é determinada, pois opera em conjuntos.

Use org.apache.commons.collections4.ListUtils

Dado

 List a = Arrays.asList(new Integer[]{ 1,2,3,4,5}); List b = Arrays.asList(new Integer[]{0,1,2,3}); 

Açao

 List c = ListUtils.removeAll(b, a) 

Resultado na lista c

 4, 5 

Por favor, tente assim

 for (Object o : a) { if (!b.contains(o)) { // this is not present } } 

aqui é outra abordagem usando o java 8 –

 a.stream().filter(b::contains).collect(Collectors.toList()); 

Faça um loop em uma lista e, em seguida, verifique se cada elemento em outra lista usa o contains .

Algo assim. Se você acha que pode haver duplicatas em a você pode tentar outro tipo de Collection , como um Set para notPresent .

  List notPresent = new ArrayList(); for (Integer n : a){ if (!b.contains(n)){ notPresent.add(n); } } 

Tente isto:

  public static void main(String[] args) { List a = new ArrayList(); List b = new ArrayList(); List exclusion = new ArrayList(); a.add(1); a.add(2); a.add(3); a.add(4); b.add(1); b.add(2); b.add(3); b.add(5); for (Integer x : a) { if (!b.contains(x)) { exclusion.add(x); } } for (Integer x : exclusion) { System.out.println(x); } } 

Tente isso …

Use o método contains() da List.

 ArrayList aList = new ArrayList(); for (Integer i : a){ if (!(b.contains(i))){ aList.add(i); } else{ continue; } }