2015-09-19 104 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」'。 –

相關問題