Вопрос-ответ

Common elements in two lists

Общие элементы в двух списках

У меня есть два ArrayList объекта с тремя целыми числами в каждом. Я хочу найти способ вернуть общие элементы двух списков. Есть ли у кого-нибудь идеи, как я могу этого добиться?

Переведено автоматически
Ответ 1

Использование Collection#retainAll().

listA.retainAll(listB);
// listA now contains only the elements which are also contained in listB.

Если вы хотите избежать влияния изменений в listA, то вам нужно создать новый.

List<Integer> common = new ArrayList<>(listA);
common.retainAll(listB);
// common now contains only the elements which are contained in listA and listB.

Если вы поклонник потоков, лучшее, что вы могли бы сделать, это Stream#filter() включить Collection#contains() другой список.

List<Integer> common = listA.stream().filter(listB::contains).toList();
// common now contains only the elements which are contained in listA and listB.

Это всего лишь как минимум в два раза медленнее.

Ответ 2

Вы можете использовать операции пересечения множеств с вашими ArrayList объектами.

Что-то вроде этого:

List<Integer> l1 = new ArrayList<Integer>();

l1.add(1);
l1.add(2);
l1.add(3);

List<Integer> l2= new ArrayList<Integer>();
l2.add(4);
l2.add(2);
l2.add(3);

System.out.println("l1 == "+l1);
System.out.println("l2 == "+l2);

List<Integer> l3 = new ArrayList<Integer>(l2);
l3.retainAll(l1);

System.out.println("l3 == "+l3);

Теперь l3 должны быть только общие элементы между l1 и l2.

CONSOLE OUTPUT
l1 == [1, 2, 3]
l2 == [4, 2, 3]
l3 == [2, 3]
Ответ 3

Зачем изобретать велосипед? Используйте коллекции Commons:

CollectionUtils.intersection(java.util.Collection a, java.util.Collection b)
Ответ 4

Использование Stream.filter() метода Java 8 в сочетании с List.contains():

import static java.util.Arrays.asList;
import static java.util.stream.Collectors.toList;

/* ... */

List<Integer> list1 = asList(1, 2, 3, 4, 5);
List<Integer> list2 = asList(1, 3, 5, 7, 9);

List<Integer> common = list1.stream().filter(list2::contains).collect(toList());
java arraylist