内部列表Erlang的自定义连接
我有一个很大的表单列表,其中包含需要与其他同名表单中的其他数据关联的数据 列表格式非常复杂,如下所示:内部列表Erlang的自定义连接,erlang,concatenation,Erlang,Concatenation,我有一个很大的表单列表,其中包含需要与其他同名表单中的其他数据关联的数据 列表格式非常复杂,如下所示: [[{EVAL_SEQ_1, {FORMNAME, ListDataToConcat1}}], [{EVAL_SEQ_2, {FORMNAME, ListDataToConcat2}}], ...] [{"eval_data_11", {<<"prvl_mobable_asset_0000_h200401">>, [{'F_01_0100',[
[[{EVAL_SEQ_1, {FORMNAME, ListDataToConcat1}}], [{EVAL_SEQ_2, {FORMNAME, ListDataToConcat2}}], ...]
[{"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">>]}]}}]
这是我想要的输出:
[{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_12”,
{,
[{'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',}]}},
[{“评估数据11”,
{,
[{'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',}]}},…]
我想要这样的结果输出:
[[{EVAL_SEQ_1, {FORMNAME, ListDataToConcat1}}], [{EVAL_SEQ_2, {FORMNAME, ListDataToConcat2}}], ...]
[{"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">>]}]}}]
[{“评估数据11”,
{,
[{'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',[[],[]}]}]
@trex:
FormList = [[{EVAL_SEQ_1, {FORMNAME, ListDataToConcat1}}], [{EVAL_SEQ_2, {FORMNAME, ListDataToConcat2}}], ....]
您需要从列表中获得一个单独的列表,该列表具有常见的表单名称,如
因此,您将获得新的元组,如下所示:
{[EVAL_SEQ_1, EVAL_SEQ_2, EVAL_SEQ_3, ...], [ListDataToConcat1, ListDataToConcat2, ListDataToConcat3,...]}
我不确定你想要哪个序列号,因为你没有清楚地提到,这里是你可以得到最小序列号的方法。
Evalsequence=列表:最小值(EvalSeq)
现在使用如下所示的merge
功能合并您的代码,或者您可以参考:
最后是一个单独的列表,如下所示:
[{Evalsequence, {<<"prvl_mobable_asset_0000_h200401">>, MergedList}}].
merge(ListOfLists) ->
Combined = lists:append(ListOfLists),
Fun = fun(Key) -> {Key,proplists:get_all_values(Key,Combined)} end,
lists:map(Fun,proplists:get_keys(Combined)).
[{Evalsequence,{,MergedList}]。
合并(列表)->
组合=列表:追加(列表列表),
Fun=Fun(Key)->{Key,proplist:get_all_value(Key,Combined)}end,
列表:地图(乐趣,道具列表:获取_键(组合))。
我向您推荐以下解决方案:
[编辑]
我修改了代码以回答您的最后一条评论,但仍然有一些模糊的东西:
- 如果资产不同,是否创建不同的记录列表
- 如果没有,资产名称该怎么办?我选择保留“最小的一个”
- 记录的顺序重要吗?我决定不重要
-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).
-模块(t)。
-编译([export_all])。
%rec={atom,term}
%重新列表=[rec,…]
%资产={bin,reclist}
%eval_data=[{列表,资产}]
%eval_集=[eval_数据,…]
%recs={atom,[term]}
%recslist=[recs,…]
addrec({Key,Val},Recslist)->
Val_list=proplists:get_值(Key,Recslist,[]),
[{Key[Val | Val|u list]}| proplist:delete(Key,Recslist)]。
merge_rec(Reclist,Recslist)->列表:foldl(fun(rec,Acc)->addrec(rec,Acc)end,Recslist,Reclist)。
合并评估([{eval,{Asset,Reclist}}],])->
[{Eval,{Asset,[{Key,[Val]}{Key,Val}
[{min(Eval,Eval_low),{min(Asset,Asset_low),merge_rec(Reclist,Recslist)}]。
合并评估集(评估集)->列表:foldl(乐趣(评估数据,Acc)->合并评估集(评估数据,Acc)结束,[],评估集)。
测试()->
Eval_set=[{“Eval_数据_10”,
{,
[{'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',}]}},
[{“评估数据11”,
{,
[{'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',}]}}],,
合并集合(评估集合)。
您的预期结果有一些不一致性{'F_01_0090'、[[“2”]、[“3”]}与{'F_01_0010'、[[]、]}
不同,您还应该澄清您是否想要重复的结果,如{'F_01_0050'、[[]、[]]}
,而不是{'F_01_0050'、[[]]
,如果您想将所有结果合并到一个资产中,即使它们出现在一个资产中,或者如果每个资产中的键列表总是相同的话。@Pascal:对不起,那是我的错误。请现在检查,它已被更正。您的代码非常漂亮。谢谢您的解决方案,我有一个问题,我想要一个最低的评估表编号I.e.Result应该与“eval_data_11”一起出现。这种情况发生在上述情况下。但当我在项目中使用此代码时,我没有得到最低的eval表单编号。因为客户端级别的javascript抛出错误。请参阅答案中的修改版本
-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).