如何在erlang中将字符串列表拆分为给定数量的列表

时间:2015-07-14 00:16:51

标签: erlang

给定一个列表和一个整数,我想将该列表拆分为指定数量的列表(在列表中)。

例如:

输入:

d3.select(dom).append('svg')

输出:

[1,2,3,4,5,6,7,8,9], 3

什么是干净有效的方法?

1 个答案:

答案 0 :(得分:3)

您可以使用lists:split/2

divide(L, N) ->
    divide(L, N, []).
divide([], _, Acc) ->
    lists:reverse(Acc);
divide(L, N, Acc) when length(L) < N ->
    lists:reverse([L|Acc]);
divide(L, N, Acc) ->
    {H,T} = lists:split(N, L),
    divide(T, N, [H|Acc]).

第一个函数divide/2用作入口点。它只是使用空列表的初始累加器值调用辅助函数divide/3,然后divide/3完成所有工作。 divide/3的第一个子句在列表完全处理后匹配,因此它只是反转累加器并返回该值。第二个子句处理L的长度小于请求的N值的情况;它通过在Acc前加L然后返回新累加器的反向来创建一个新的累加器。第三个子句首先调用lists:split/2将传入列表拆分为HN元素列表)和T(列表的其余部分)。然后它以递归方式调用自身,将T作为新列表值,原始N值和由H组成的新累加器作为第一个元素和原始累加器{{1作为尾巴。