2017-02-21 89 views
0

Прежде всего, я ничего не знаю о Erlang, мы являемся мной и коллегой, переписывающей карту Уменьшить на couchDB от JS до Erlang в качестве теста.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)), 

Любая идея, как мы можем сделать это в более эффективный способ? , потому что здесь мы просто делаем цикл (списки: карта) для каждого желаемого значения. И наш ум слишком туго зависит от процедурного программирования и изменяемых переменных, поэтому мы не можем найти эффективный способ сделать это.

Благодаря

ответ

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, я буду обновлять позже .. (на этой неделе, вероятно, когда i У меня будет время для установки проблемы за пределами couchdb) В любом случае спасибо за попытку :) – cyqui

+0

Я обновил ответ, чтобы соответствовать вашим комментариям. –

+0

Удивительный! это именно то, что я надеялся, что мы сможем сделать в erlang .. Попробуем это в следующий раз, когда у меня что-то похожее (dict & dict: update - это удивительность здесь для нас) – cyqui