2010-05-26 55 views
9

的名单我有一个这样的名单:二郎:扁平化的字符串

[["str1","str2"],["str3","str4"],["str5","str6"]] 

,我需要将其转换为

["str1", "str2", "str3", "str4", "str5", "str6"] 

我该怎么办呢?

的问题是,我处理字符串列表,所以当我做

lists:flatten([["str1","str2"],["str3","str4"],["str5","str6"]]) 

我得到

"str1str2str3str4str5str6" 

然而,如果原来的列表,只是原子的元素,那么lists:flatten会给我我需要的东西。我如何在字符串中实现相同效果?

回答

12

名单:追加不正是你所需要的:

1> lists:append([["str1","str2"],["str3","str4"],["str5","str6"]]). 
["str1","str2","str3","str4","str5","str6"] 

(名单:CONCAT做正确的事,但威胁做一些类型转换太)

2

如果您的列表始终是一个,那么你可以简单地使用foldl运营商,拥有类似“字符串列表清单”:

Flat = list:foldl(fun(X, Acc) -> X ++ Acc end, [], List) 

在这种情况下你的列表嵌套可以任意深度的,我宁愿建议,让二郎知道你的字符串不是单纯的文字列表,使用的编码,如:

[[{string, "str1"},{string, "str2"}], 
[{string, "str3"}, {string, "str4"}], 
[{string, "str5"},{string, "str6"}]] 

这样,list:flatten会做正确的事,并给:

[{string, "str1"},{string, "str2"}, 
{string, "str3"}, {string, "str4"}, 
{string, "str5"},{string, "str6"}] 

如果需要,可以使用foldl将其转换回原始字符串列表。 如果你的字符串的处理方式与单纯的字符列表不同,那么他们可能应该成为一个真正的数据结构,请参阅blog entry以获得关于此问题的有趣讨论。

+0

谢谢!它的工作原理:) – ErJab 2010-05-26 09:28:59

+3

如果你想要一个更通用的方法,你可能想看看io_lib:printable_list/1。即如果列表不可打印,则只能变平。 – Lukas 2010-05-26 09:47:31

+0

'list:foldl(fun erlang:'++'/ 2,[],List)'更短。 – nox 2013-01-16 16:36:37

1

列表:CONCAT/1 ...作品

0

原因列表:flatten对你不起作用的是,Erlang中的字符串只是小整数列表。如果列表只是一个字符串,我们可以用一个停止在嵌套列表中递归的函数来处理这个问题。

对于您可以使用下面的函数字符串的任意嵌套列表:

slab([]) -> 
    []; 
slab([F|R]) -> 
    case io_lib:char_list(F) of 
     true -> [F|slab(R)]; 
     false -> slab(F) ++ slab(R) 
    end. 

它使用io_lib:char_list(),以决定是否嵌套递归是足够深。

Exampe操作:

1> slab([[["foo", "bar"], "baz", [[[["foobar"]]]], "froboz", "the end"]]). 
["foo","bar","baz","foobar","froboz","the end"] 
2> 

小的提升,将有可能使用混合嵌套列表:

slab([]) -> 
    []; 
slab([F|R]) when is_list(F) -> 
    case io_lib:char_list(F) of 
     true -> [F|slab(R)]; 
     false -> slab(F) ++ slab(R) 
    end; 
slab([F|R]) -> 
    [F|slab(R)]. 

这种行为就像列表:扁平化,除了它处理字符串如果他们将没有列表:

1> slab([[["foo", "bar"], "baz", [[[["foobar", atom]],[a,b,c]]], 2, "froboz", "the end"]]). 
["foo","bar","baz","foobar",atom,a,b,c,2,"froboz","the end"]