从Map中返回第一个{Key,Value},其中Predicate为true

时间:2015-01-08 00:07:39

标签: erlang

更正式的问题定义是

  

编写一个返回第一个函数的map_search_pred(Map,Pred)函数   地图中的元素{Key,Value},其中Pred(Key,Value)为true。

我的尝试,看起来像是

map_search_pred(Map, Pred)  ->
  M = [{Key, Value} || {Key, Value} <- maps:to_list(Map), Pred(Key, Value) =:= true],
  case length(M) of
    0 -> {};
    _ -> lists:nth(1, M)
  end.

当我运行时,我得到了正确答案

1> lib_misc:map_search_pred(#{}, fun(X, Y) -> X =:= Y end).
{}
2> lib_misc:map_search_pred(#{1 => 1, 2 => 2}, fun(X, Y) -> X =:= Y end).
{1,1}
3> lib_misc:map_search_pred(#{1 => 1, 2 => 3}, fun(X, Y) -> X =:= Y end).
{1,1}
4> lib_misc:map_search_pred(#{1 => 2, 2 => 2}, fun(X, Y) -> X =:= Y end).
{2,2}
5>   

问题吗
问题在于效率 它使用列表推导并运行列表中的所有元素。更好的解决方案是在第一场比赛后返回。

作为语言的初学者,我不知道更好的解决方法,所以寻找更好的想法和建议

1 个答案:

答案 0 :(得分:2)

您可以自行查看列表,并在找到Pred(Key, Value)为真的元素后立即返回:

map_search_pred(Map, Pred) when is_map(Map) ->
    map_search_pred(maps:to_list(Map), Pred);
map_search_pred([], _) ->
    error;
map_search_pred([{Key,Value}=H|T], Pred)  ->
    case Pred(Key, Value) of
        true ->
            {ok, H};
        false ->
            map_search_pred(T, Pred)
    end.