2014-12-10 96 views
1

爲什麼erlang列出:扁平化如果嵌套列表只包含一個元素,則不會返回列表。Erlang列表:扁平化一個元素

例子:

DeepList = [[],[],["ONE"],[],[]]. 
[[],[],["ONE"],[],[]] 
lists:flatten(DeepList). 
"ONE" 

這使我的下列順序難以包含列表:的foreach,因爲它看到「ONE」的名單,並試圖遍歷這一點。我相信我錯過了這樣做的更好方法。任何指導將不勝感激。

回答

2

「ONE」也是一個列表(發生的整數對應於這種情況下的可打印字符值)。

你會不會感到驚訝,如果你看到了這一點:

1> lists:flatten([[],[],[1,2,3],[],[]]). 
[1,2,3] 

現在檢查了這一點:

2> lists:flatten([[],[],[79,78,69],[],[]]). 
"ONE" 

通常更容易(和更有效)處理「字符串「數據作爲二進制文件:

3> lists:flatten([[],[],<<"ONE">>,[],[]]). 
[<<"ONE">>] 

」效率更高「部分來自您可能會在二進制數據上進行的其他操作(比如匹配,分割等)以及二進制文件的大量內存佔用。

編輯

我忘了提及的string:join/2聯合動力在這種情況下string:tokens/2

4> string:tokens(string:join([[],[],"ONE",[],[]], " "), " "). 
["ONE"] 
5> string:tokens(string:join([[],[],"ONE",[],"Two"], " "), " "). 
["ONE","Two"] 

可是......而是一個極好的黑客攻擊,它從每一個遭受惡劣作爲黑客(它的醜陋,不清楚,沒有說明你的意思,不自覺地是空白的,並且大大低於處理二進制文件的效率)方面。

+0

我明白,字符串是一個列表。我正在考慮將這些翻轉爲二進制字符串。我會給那一槍。謝謝! – RockyMountainHigh 2014-12-10 23:30:01

+0

另一種方式來做到這一點,但留下一個字符串是'[列表:flatten(東西)]'嵌套在列表中的結果,但通常結束後,你不打算在後面的影響。通常,標記元組對於數據中的位置順序決定語義值是最好的,我想你正在某個地方工作(解析用戶輸入或其他東西?)。 – zxq9 2014-12-10 23:33:57

+0

@RockyMountainHigh只記得'token/2'和'join/2'--所以我在答案中加入了這個組合的例子。 – zxq9 2014-12-10 23:40:04