Erlang:查找列表的多个Max值

时间:2017-02-21 11:03:44

标签: algorithm list functional-programming erlang

首先,我对Erlang一无所知,我们是一位同事,将一个从Red JS改编成的数据库从JS转换为Erlang作为测试。

在输入中我们有类似的东西:

{[
    {<<"score">>, {[ {<<"max">>, SCORE_MAX} ]} },
    {<<"points">>, {[ {<<"max">>, POINTS_MAX}, {<<"total">>, POINTS_TOTAL} ]} },
    {<<"time">>, {[ {<<"total">>, TIME_TOTAL} ]} },
    {<<"success">>, SUCCESS},
//etc..
]}

我们希望遍历列表[[得分,进度,分数]]并输出此列表的“最大值(得分),最大值(进度),最大值(点数)”。

到目前为止,我们唯一成功的做法是每个最大值(值)或我们想要的总和(值)一个循环例如:

        PROGRESS_MAX = lists:max(lists:map(fun({Value}) ->
            {Progress} = proplists:get_value(<<"progress">>, Value),
            proplists:get_value(<<"max">>, Progress)
        end, Values)),

        LEVEL_MAX = lists:max(lists:map(fun({Value}) ->
            {Level} = proplists:get_value(<<"level">>, Value),
            Max = proplists:get_value(<<"max">>, Level, 0)
        end, Values)),

        POINTS_TOTAL = lists:sum(lists:map(fun({Value}) ->
            {Points} = proplists:get_value(<<"points">>, Value),
            proplists:get_value(<<"total">>, Points)
        end, Values)),

知道如何以更有效的方式做到这一点吗? 因为在这里我们只是为我们想要的每种值做一个循环(列表:map)。我们的思维对于程序编程和可变变量来说太紧了所以我们无法找到一种有效的方法来实现它。 / p>

由于

1 个答案:

答案 0 :(得分:1)

更新了答案以反映评论

我冒昧地修改输入数据,以便编写答案。

    InputList = [{[
   {<<"score">>, {[ {<<"max">>, 2} ]} },
   {<<"points">>, {[ {<<"max">>, 3}, {<<"total">>, 7} ]} },
   {<<"time">>, {[ {<<"total">>, 4} ]} },
   {<<"success">>, 9}
   ]},
 {[
   {<<"score">>, {[ {<<"max">>, 2} ]} },
   {<<"points">>, {[ {<<"max">>, 3}, {<<"total">>, 7} ]} },
   {<<"time">>, {[ {<<"total">>, 4} ]} },
   {<<"success">>, 9}
   ]}],
lists:foldl(fun({L0}, Dict0)->
                    lists:foldl(fun({E, {L}}, Dict1)->
                                        Max=proplists:get_value(<<"max">>, L, 0),
                                        dict:update(E, fun(OldValue)-> OldValue + Max end, Max, Dict1);
                                   (_, Dict1) -> Dict1 
                                end, Dict0, L0)
           end, dict:new(), InputList).