Erlang Central

Finding Elements in One Array but Not Another

Revision as of 14:58, 24 September 2006 by Ayrnieu (Talk | contribs)

Problem

You want to find elements that are in one list but not another.

Solution

You want to find elements in list A that aren't in list B. Erlang provides several ways of doing this:

Use lists:subtract/2 , or the equivalent -- operator.

1> A = lists:seq(1,16).
[1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16]
2> B = lists:seq(2,16,2).
[2,4,6,8,10,12,14,16].
3> lists:subtract(A,B).
[1,3,5,7,9,11,13,15]
4> A -- B.
[1,3,5,7,9,11,13,15]

Iterate over the two lists

You can iterate over the two lists, and filter out any entries from list A that are also members of list B.

5> lists:foldr(fun(X,Acc) -> Y=lists:member(X, B),
5>    if Y -> [X|Acc];
5>    true -> ACC
5> end end, [], A).
[1,3,5,7,9,11,13,15]
6> lists:filter(fun (X) -> not lists:filter(X,B) end, A).
[1,3,5,7,9,11,13,15]