2015-09-19 103 views
1

我想写一个将读取元组列表的程序,在元组中它将包含两个元素。第一个元素可以是Object,第二个元素将是该Object的数量。就像:Mylist([{Object1,Numbers},{Object2, Numbers}])
然后我想读Numbers并打印相关的对象Numbers次,然后将它们存储在一个列表中。
所以如果Mylist([{lol, 3},{lmao, 2}]),那么我应该得到[lol, lol, lol, lmao, lmao]作为最终结果。
我的想法是首先将这些元组解压缩成两个元组,第一个元组包含对象,第二个元组包含数量数字。
之后,读取第二个元组中的数字,然后用精确的次数在第一个元组中打印相关的对象。但我不知道该怎么做。谢谢你的帮助!如何从列表中读取元组中的每个元素

回答

3

列表理解可以这样做:

lists:flatten([lists:duplicate(N,A) || {A, N} <- L]). 

如果你真的想在打印过,使用递归:

p([]) -> []; 
p([{A,N}|T]) -> 
    FmtString = string:join(lists:duplicate(N,"~p"), " ")++"\n", 
    D = lists:duplicate(N,A), 
    io:format(FmtString, D), 
    D++p(T). 

该代码使用lists:duplicate/2复制"~p"格式io:format/2格式字符串说明符N次,将它们与string:join/2的空格结合,并添加一个换行符。然后它再次使用lists:duplicate/2获取N副本的列表A,使用格式字符串打印这些N项目,然后将列表与递归调用的结果组合以创建函数结果。

+0

我可以问一下'string:join'在程序中做什么吗? – maoyi

+0

'string:join/2'调用在重复的“〜p”字符串之间放置空格。例如,如果'N'是3,'lists:duplicate(3,“〜p”)''返回'[“〜p”,“〜p”,“〜p”]',并从那个'string:join (列表:重复(3,“〜p”),“”)'产生字符串'“〜p〜p〜p”'。 –

相关问题