Finding Elements in One Array but Not Another
From Erlang Community
| Revision as of 02:37, 31 August 2006 (edit) Cyberlync (Talk | contribs) ← Previous diff |
Revision as of 22:43, 3 September 2006 (edit) (undo) Bfulgham (Talk | contribs) Next diff → |
||
| Line 37: | Line 37: | ||
| - | [[Category:CookBook]] | + | [[Category:CookBook]][[Category:ListRecipes]] |
Revision as of 22:43, 3 September 2006
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 the lists:subtract Function
The lists module provides the subtract function, which takes two list and returns a new copy of the first list, such that the first occurrence of each element of the second list is removed. For example:
1> A = [1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16]. [1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16] 2> B = [2,4,6,8,9,10,12,14,15,16]. [2,4,6,8,9,10,12,14,15,16]. 3> lists:subtract(A,B). [1,3,5,7,11,13] |
Note: Erlang provides native list operators for concatentation (++) and subtraction (--). The subtraction operator provides the same functionality as the lists:subtract function:
4> A -- B. [1,3,5,7,11,13] |
Iterate over the two lists
You can iterate over the two lists (using the lists:foreach function), and filter out any entries from list A that are also members of list B.
5> lists:foldl(fun(X,ACC) -> Y=lists:member(X, B), 5> if Y -> [X|ACC]; 5> true -> ACC 5> end end, [], lists:reverse(A)). [2,4,6,8,9,10,12,14,15,16] |

Digg It
Del.icio.us
Reddit
Facebook
Stumble Upon
Technorati

