2017-08-23 2 views
1

Je voudrais de l'aide, s'il vous plaît. J'ai une liste d'utilisateurs et leurs factures. Il peut y avoir plusieurs utilisateurs et chaque utilisateur peut avoir plusieurs factures. Donc, je voudrais passer de [{user, invoice}] à [{user, [invoice]}].Erlang - transformation des listes

Par exemple, convertir cette ...

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

Dans cette ...

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

La liste initiale est-elle triée par utilisateur? –

+0

Oui monsieur, c'est. Par utilisateur et par facture –

Répondre

2

J'utilise fold() pour créer un dict puis en faire une liste:

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)). 
+0

Je vais essayer. Merci beaucoup. –

0

Vous n'avez pas besoin d'utiliser des plis ou des dictionnaires. En supposant qu'ils sont triés par les utilisateurs, vous pouvez le faire. Il maintient également la liste triée.

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

Merci beaucoup. Celui-ci a fait l'affaire. –

+0

Content de pouvoir aider. Pourriez-vous s'il vous plaît marquer ceci comme la bonne réponse, pour les autres personnes qui cherchent la réponse. –