2017-02-21 40 views
0

首先我不知道Erlang的任何信息,我们是一个同事,将couchDB中的Map Reduce从JS更改为Erlang作为测试。Erlang:查找列表的多个最大值

在输入,我们有这样的事:

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

我们想遍历列表[比分,进度,分]和输出的“最大(得分),MAX(进度),MAX(点)“的名单。

到目前为止,我们成功做的唯一的事情是按最大值(值)或和(数值)一个循环中,我们想例如:

 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)......而且我们的思维太紧以至于程序编程和可变变量,所以我们不能找出一个有效的方法来实现它。

感谢

回答

2

更新了答案,以反映意见

我已经采取了自由修改,以使答案编译输入数据。

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). 
+0

我觉得我没有正确地暴露这个问题,因为我们在couchview内。 但输入是头部示例的数组。 所以,我们需要'最大的最大值'。 在工作中,我们继续前进,并分解到更多的视图来简化一切(erlang语法等..),但为了理解如何使用纯Erlang完成,我稍后会更新..(本周结束可能当我有时间在couchdb以外设置问题) 无论如何感谢您的尝试:) – cyqui

+0

我已更新答案以配合您的意见。 –

+0

太棒了!这正是我希望我们可以在erlang中做的事情。 下次我有类似的东西时会尝试它(字典和字典:更新是我们的真棒) – cyqui