【问题标题】:Erlang - lists transformationErlang - 列出转换
【发布时间】:2018-02-01 01:40:24
【问题描述】:

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

例如,转换这个...

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

进入这个...

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

【问题讨论】:

  • 初始列表是否按用户排序?
  • 是的,先生,是的。按用户和发票

标签: list erlang


【解决方案1】:

您不需要使用折叠或字典。假设它们按用户排序,您可以这样做。它还保持列表排序。

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]]).

【讨论】:

  • 很高兴我能帮上忙。请您将此标记为正确答案,以供其他正在寻找答案的人使用。
【解决方案2】:

我会使用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)).

【讨论】:

  • 我要试一试。非常感谢。
猜你喜欢
  • 2011-04-24
  • 1970-01-01
  • 2015-04-20
  • 2018-08-23
  • 2015-07-01
  • 2016-06-30
  • 1970-01-01
  • 1970-01-01
  • 2011-10-03
相关资源
最近更新 更多