[erlang-questions] testing a list against an ets table
Doug Edmunds
dougedmunds@REDACTED
Fri Jun 20 01:00:57 CEST 2008
Scenario:
The goal is determine if any tuples in the List are not
in the Table (and if so, identify which are missing).
I wrote two functions, one which uses ets:match_object/2 and
the other which uses lists:member/2.
Function parameters:
List is a list of tuples [{a,b}, {c,d,e}, {a,d}, ...].
Table is an open ets table of type 'bag', which means
there can be more than one item with the same key in
the table.
Which of these methods is preferable, and why?
%% a quick display utility function
io(X) -> io:format("~p~n",[X]).
findlist1(List,Table) ->
R1 = [E || E <- List, length(ets:match_object(Table, E)) == 0],
io(R1), %% elements not found in table
io(length(R1)). %% if length(R1) == 0, all are in list
findlist2(List, Table) ->
AsList = ets:tab2list(Table),
R1 = [E || E <- List, not lists:member(E,AsList)],
io(R1), %% same as above
io(length(R1)).
length(R1) could be turned into true/false thus:
case length(R1) of
0 -> true; % all in table
_Other -> false
end.
What are some other alternatives?
Also, I would appreciate suggestions on
how to short-circuit the evaluation
(stopping as soon as one element of the
list is not found in the table).
Thanks.
-dae
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://erlang.org/pipermail/erlang-questions/attachments/20080619/a70638d0/attachment.htm>
More information about the erlang-questions
mailing list