2017-02-21 5 views
0

最初のリストの複数の最大値を見つける、私たちは私であり、地図を書き換える同僚は、テストとしてJSからアーランへのCouchDBに削減します。私たちは、リストをトラバースしたいアーラン:私はアーランについて何も知らないすべての

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

と出力「MAX(スコア)、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)), 

我々は、より効率的な方法でそれを行うことができますどのように任意のアイデア:

これまでのところ、私たちがやって成功した唯一のものは、最大(値)または合計(値)ごとに一つのループは、私たちがたとえばたいのですか? ここでは、私たちが望むすべての種類の値に対して単純にループ(リスト:マップ)を実行しているため、私たちの心は手続き型プログラミングや可変変数に対してはタイトすぎるので、効率的な方法を見つけられません。

おかげ

答えて

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の中にいるので、問題は正しく表示されていないと思います。 しかし、入力は頭の中の例の配列です。 このように、「最大の最大値」が必要です。仕事で は、我々は上に移動し、すべてを簡素化するために複数のビューに分割さ(アーランsyntaxe等。)しかし、それは純粋なアーランを使用して行うことができる方法を理解するために、私はこの週の終わりそうな(..後に更新されますときに私couchdbの外で問題をセットアップする時間があります) とにかくお試しいただきありがとうございます:) – cyqui

+0

私はあなたのコメントに一致するように答えを更新しました。 –

+0

驚くばかり!それはちょうど私が私たちがエルランでできることを望んでいたものです。 次回私は何か似たようなことをしようとします(dict&dict:アップデートはここでは素晴らしいものです) – cyqui

関連する問題