我是Erlang的新手,所以这个问题可能有点基础 我有一个N ^ 2个元素的数组(我知道N),我想用N个元素分解成一个数组(或元组,并不重要),每个元素有N个元素。
即:我想转:
[14,20,26,20,29,38,26,38,50]
成:
[{14,20,26},{20,29,38},{26,38,50}}
是否有一种简单的方法或功能可以做到这一点?
感谢。
答案 0 :(得分:5)
使用模式匹配:
s([X, Y, Z | Next]) ->
[{X, Y, Z} | s(Next)];
s([]) -> [].
如果您不提供3个元素的倍数,这将失败,但这可能是您想要的。
答案 1 :(得分:0)
这应该做你想要的。
s(L,N) -> s(L,N,[]).
s([],_,R) -> lists:reverse;
s(L,N,R) ->
{L1,L2} = lists:split(N,L),
s(L2,[list_to_tuple(L1)|R]).
答案 2 :(得分:0)
您可以使用此功能sublist(List1, Start, Len) -> List2
,
从Start开始并使用(max)Len返回List1的子列表 元素。 Start + Len超过长度不是错误 列表。
unflatten(L, N) ->
case N*N == length(L) of
true -> unflatten_help(L, 1, N, []);
false ->
{error, "wrong list length!"}
end.
unflatten_help(_L, Start, N, Res) when Start == (N*N + 1) ->
lists:reverse(Res);
unflatten_help(L, Start, N, Res) ->
Temp = lists:sublist(L, Start, N),
unflatten_help(L, Start + N, N, [Temp | Res]).
main() ->
L = [14,20,26,20,29,38,26,38,50],
unflatten(L, 3).
输出:
[[14,20,26],[20,29,38],[26,38,50]]
答案 3 :(得分:0)
我认为以下代码适合您:
array_to_tuples([],_) -> [];
array_to_tuples(L,N) ->
{L1,L2} = lists:split(N,L),
[list_to_tuple(L1)|array_to_tuples(L2,N)].
这将在N个元组中考虑N * 2个元素来分割数组。