6

I have two lists A and B. both have millions of elements. I want to compare and get all elements those are in list A but not in list B. Below is inefficient way to get elements.

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

I looking for an efficient way with or without streams to get elements

help is appreciated in this regards.

Thanks

2

2 Answers 2

2

You don't need to compare

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

And if you don't mind loosing the original list data

a.removeAll(b);
Sign up to request clarification or add additional context in comments.

2 Comments

Depending on the sizes of the input lists it might be more efficient to create a Set instead of an ArrayList (but not necessarily, see stackoverflow.com/questions/28671903/…). Either way, while this is a simple and readable approach, it first creates a full copy of a list containing "millions of elements".
@Hulk It isn't necessary to create the copy if you don't mind loosing the original list.
1

Something like this should suffice:

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

or non-stream:

Set<Integer> container = new HashSet<>(ListB);
for(Integer id : ListA)
    if(!container.contains(id));
       System.out.println(id);

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.