erlang - Erlang 内部列表的自定义串联

标签 erlang concatenation

我有一些表单的大列表,其中的数据需要与其他同名表单中的其他数据连接起来。

列表格式相当复杂,如下所示:

[[{EVAL_SEQ_1, {FORMNAME, ListDataToConcat1}}], [{EVAL_SEQ_2, {FORMNAME, ListDataToConcat2}}], ...]

这是我想要的输出:

[[{EVAL_SEQ_1, {FORMNAME, ListDataToConcat1 + ListDataToConcat2}}]}}] ...]

地点:

EVAL_SEQ_1 = Form Sequence Number,
FORMNAME = Form Name
ListDataToConcat = List that Needs to concat

例如,这是我的示例数据:

[[{"eval_data_12",
    {<<"prvl_mobable_asset_0000_h200401">>,
     [{'F_01_0100',[1]},
      {'F_01_0090',["3"]},
      {'F_01_0080',[]},
      {'F_01_0070',[9999]},
      {'F_01_0060',[{era,0},{year,[]},{month,[]}]},
      {'F_01_0050',[]},
      {'F_01_0040',[]},
      {'F_01_0030',[]},
      {'F_01_0020',<<>>},
      {'F_01_0010',<<"4 - 8">>}]}}],
  [{"eval_data_11",
    {<<"prvl_mobable_asset_0000_h200401">>,
     [{'F_01_0100',[]},
      {'F_01_0090',["2"]},
      {'F_01_0080',[]},
      {'F_01_0070',[22222]},
      {'F_01_0060',[{era,0},{year,[]},{month,[]}]},
      {'F_01_0050',[]},
      {'F_01_0040',[]},
      {'F_01_0030',[]},
      {'F_01_0020',<<>>},
      {'F_01_0010',<<"4 - 1">>}]}}], ...]

我想要这样的结果输出:

[{"eval_data_11",
   {<<"prvl_mobable_asset_0000_h200401">>,
         [{'F_01_0100',[[], [1]]},
          {'F_01_0090',[["2"], ["3"]]},
          {'F_01_0080',[[], []]},
          {'F_01_0070',[[22222], [9999]]},
          {'F_01_0060',[[{era,0},{year,[]},{month,[]}], [{era,0},{year,[]},{month,[]}]]},
          {'F_01_0050',[[], []]},
          {'F_01_0040',[[], []]},
          {'F_01_0030',[[], []]},
          {'F_01_0020',[[<<>>], [<<>>]]},
          {'F_01_0010',[[<<"4 - 1">>], [<<"4 - 8">>]}]}}]

最佳答案

我向您建议这个解决方案:

[编辑]

我修改了代码来回答你最后的评论,仍然有模糊的地方:

  • 如果 Assets 不同,会创建不同的记录列表吗?
  • 如果不是,应该如何处理 Assets 名称?我选择保留“最小的”
  • 记录的顺序重要吗 - 我决定不重要

需要注意的是,我缺少一些上下文,但是如果我添加收集此类信息,我会将其存储在 ets 表中。它更新速度更快,易于遍历,并且在需要时易于转换为列表。

-module (t).

-compile([export_all]).

%      rec = {atom,term}
%      reclist = [rec,...]
%      asset = {bin,reclist}
%      eval_data = [{list,asset}]
%      eval_set = [eval_data,...]
%      recs = {atom,[term]}
%      recslist = [recs,...]

addrec({Key,Val},Recslist) ->
    Val_list = proplists:get_value(Key, Recslist, []),
    [{Key,[Val|Val_list]}|proplists:delete(Key,Recslist)].

merge_rec(Reclist,Recslist) -> lists:foldl(fun(Rec,Acc) -> addrec(Rec,Acc) end,Recslist,Reclist).


merge_eval([{Eval,{Asset,Reclist}}],[]) ->
    [{Eval,{Asset,[{Key,[Val]} || {Key,Val} <- Reclist]}}];
merge_eval([{Eval,{Asset,Reclist}}],[{Eval_low,{Asset_low,Recslist}}]) ->
    [{min(Eval,Eval_low),{min(Asset,Asset_low),merge_rec(Reclist,Recslist)}}].

merge_set(Eval_set) -> lists:foldl(fun(Eval_data,Acc) -> merge_eval(Eval_data,Acc) end,[],Eval_set).

test() ->
    Eval_set =  [[{"eval_data_10",
                {<<"prvl_mobable_asset_0000_h200401">>,
                 [{'F_01_0100',[1]},
                  {'F_01_0090',["3"]},
                  {'F_01_0080',[]},
                  {'F_01_0070',[9999]},
                  {'F_01_0060',[{era,0},{year,[]},{month,[]}]},
                  {'F_01_0050',[]},
                  {'F_01_0040',[]},
                  {'F_01_0030',[]},
                  {'F_01_0020',<<>>},
                  {'F_01_0010',<<"4 - 8">>}]}}],
              [{"eval_data_11",
                {<<"prvl_mobable_asset_0000_h200401">>,
                 [{'F_01_0100',[]},
                  {'F_01_0090',["2"]},
                  {'F_01_0080',[]},
                  {'F_01_0070',[22222]},
                  {'F_01_0060',[{era,0},{year,[]},{month,[]}]},
                  {'F_01_0050',[]},
                  {'F_01_0040',[]},
                  {'F_01_0030',[]},
                  {'F_01_0020',<<>>},
                  {'F_01_0010',<<"4 - 1">>}]}}]],
    merge_set(Eval_set).

关于erlang - Erlang 内部列表的自定义串联,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23340668/

相关文章:

php - Mysql 多对多映射表返回一行并连接会导致重复行的值

mysql - 我需要在 mysql 中连接两个数字

mysql - 跨不同表的连接 - mysql/php 堆栈

erlang - 带退避的主管

sockets - 将控制权从一个 gen_fsm 传递到另一个

erlang - ets :new for unnamed tables 中 name 参数的原因

python - Pandas dataframe 使用 pd.concat 将字符串替换为 NaN

clojure - Erlang 持久数据结构

concurrency - 如何使用 Erlang 样式并发 "share state"?

MySQL - 如何连接至少包含一个字母字符的列