[erlang-questions] Help on dictionary search

Thomas Lindgren thomasl_erlang@REDACTED
Tue Nov 7 15:37:47 CET 2006

--- Bob Cowdery <Bob.Cowdery@REDACTED> wrote:

> I wonder if someone could help me with what I guess
> must seem a fairly elementary problem. 
> I have a dictionary of the form [{class, [Pid, Pid,
> Pid ...]}, {class1[...]}, ...]. A given Pid can
> appear in one or more classes. Given a Pid I want to
> delete all instances of that Pid from the dictionary
> and if the class then has an empty list to remove
> the class. Generally I look up the dictionary by
> class and don't mind a linear search for the delete
> as its occational.
> I think it's something like this, but I get lost on
> the details and don't know how to 'do something'
> with the head. Do I need to return a new dictionary.

How about this?

The following function deletes the PID from all the
class lists, but can leave {class, []} behind, which
you don't want:

delete_pid(PID, Classes) ->
   [ {Class, [ P || P <- PIDs, P =/= PID ]}
     || {Class, PIDs} <- Classes ].

There are a couple of ways to get rid of empty
classes. Use an extra pass:

delete_empty_classes(Classes) ->
   [ {Class, PIDS} 
     || {Class, PIDs} <- Classes, PIDs =/= [] ].

then run

delete_pid1(PID, Classes) ->
  delete_empty_classes(delete_pid(PID, Classes))

or rewrite delete_pid/2 to directly discard empty

delete_pid2(PID, [{Class, PIDs}|Classes]) ->
   case [ P || P <- PIDs, P =/= PID ] of
      [] -> delete_pid2(PID, Classes);
      Ps -> [{Class, Ps}|delete_pid2(PID, Classes)]
delete_pid2(PID, []) -> [].

That can also be written as a fold:

delete_pid3(PID, Classes) ->
      fun({Class, PIDs}, Acc) ->
         case [ P || P <- PIDs, P =/= PID ] of
            [] -> Acc;
            Ps -> [{Class,Ps}|Acc]

Warning: not extensively tested :-)


Do You Yahoo!?
Tired of spam?  Yahoo! Mail has the best spam protection around 

More information about the erlang-questions mailing list