Сравните два списка строк, используя поток Java - PullRequest
0 голосов
/ 05 ноября 2018

У меня есть два списка A и B. У обоих есть миллионы элементов. Я хочу сравнить и получить все элементы, которые находятся в списке A, но отсутствуют в списке B. Ниже приведен неэффективный способ получения элементов.

   if (!B.containsAll(A)) {
        for (Integer id : A) {
            if (!B.contains(id)) {
                System.out.println(id);
            }
        }
    }

Я ищу эффективный способ с или без потоков, чтобы получить элементы

помощь приветствуется в этом отношении.

Спасибо

Ответы [ 2 ]

0 голосов
/ 05 ноября 2018

Что-то вроде этого должно быть достаточно:

Set<Integer> container = new HashSet<>(ListB);
ListA.stream()
     .filter(id -> !container.contains(id))
     .forEach(System.out::println);

или без потока:

Set<Integer> container = new HashSet<>(ListB);
for(Integer id : ListA)
    if(!container.contains(id));
       System.out.println(id);
0 голосов
/ 05 ноября 2018

Вам не нужно сравнивать

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

А если вы не против потерять исходные данные списка

a.removeAll(b);
...