Erlang - 列出转换

时间:2017-08-23 12:46:46

标签: list erlang

我想要一些帮助。 我有一个用户列表及其发票。可以有许多用户,每个用户可以有很多发票。 所以,我想从[{user, invoice}]转到[{user, [invoice]}]

例如,转换此...

[{user1, invoice11}, {user1, invoice12}, {user2, invoice21}, {user2, invoice22}]. 

进入这个...

[{user1, [invoice11, invoice12]}, {user2, [invoice21, invoice22]}].

2 个答案:

答案 0 :(得分:1)

我使用fold()创建dict,然后将其设为列表:

UsersInvoices = [{user1, invoice11}, {user1, invoice12},
                 {user2, invoice21}, {user2, invoice22}].

dict:to_list(lists:foldl(fun({User, Invoice}, D) ->
                             dict:append(User, Invoice, D) end,
                         dict:new(), UsersInvoices)).

答案 1 :(得分:0)

您不需要使用折叠或词典。假设它们按用户排序,您可以执行此操作。它还使列表保持排序。

convert([{U, I}|R])->convert(R,[{U,[I]}]).
convert([], RL)->lists:reverse(RL);
convert([{U, I}|R], [{U,IL}|RL])->convert(R, [{U, [I|IL]}|RL]);
convert([{U1, I}|R], [{U2, IL} |RL])->convert(R, [{U1, [I]}|[{U2, lists:reverse(IL)}|RL]]).