如何在erlang中打印出二维数组的元素
How to print out the elements of a 2D array in erlang
我一直试图在 erlang 中打印出二维数组的元素,但是,因为没有循环,因此没有简单的方法来增加一个变量,更不用说两个了。我已经看到一个或两个递归函数用于制作单个循环,但是,我无法将此代码转换为嵌套循环。这是我一直在使用的代码。
-module(test2).
-export([do_loop/0,loop/1]).
do_loop() ->
loop(0).
loop(10) ->
ok;
loop(Count) ->
io:format("~w~n", [Count]),
loop(Count+1).
感谢任何帮助!
编辑:
这是数组的代码
create( X, Y ) -> array:new( [{size, X}, {default, array:new( [{size, Y}] )}] ).
get( X, Y, Array ) -> array:get( Y, array:get(X, Array) ).
数组模块提供foldl
和foldr
分别从低到高和从高到低折叠数组。
使用 foldl
并递归到二级数组(及以后):
-module(test).
-export([dump/1]).
dump(Array) ->
array:foldl(fun inner_dump/3, [], Array).
转储函数接受数组并开始折叠。 array:foldl
采用折叠函数、初始累加器和要折叠的数组。它依次获取数组的每个元素并调用 FoldFun(Index, Element, Accumulator)
,该调用的 return 值成为新的累加器。对于此函数,我已将累加器定义为父数组中的索引列表。
inner_dump( Index, ArrayOrElement, Previous) ->
case array:is_array(ArrayOrElement) of
false ->
io:format("~p ~p~n", [lists:reverse([Index|Previous]), ArrayOrElement]),
Previous;
true ->
array:foldl(fun inner_dump/3, [Index|Previous], ArrayOrElement),
Previous
end.
这是折叠功能。如果传递的元素不是数组,则将其索引添加到父索引列表中,然后反转该列表并将其与元素一起打印。 (这给出了每个数组的索引,如预期的那样从最外层开始)
如果传递的元素是一个子数组,将其索引添加到父索引列表中并以相同的方式折叠它。
这将允许您打印出任意深度的数组,并且即使每个子数组的大小不同也仍然有效。
下面是一个使用数组 [[a,b,c],[1,2,3],["yes","no","maybe"]]
:
的例子
2> Array.
{array,3,0,undefined,
{{array,3,10,undefined,
{a,b,c,undefined,undefined,undefined,undefined,undefined,
undefined,undefined}},
{array,3,10,undefined,
{1,2,3,undefined,undefined,undefined,undefined,undefined,
undefined,undefined}},
{array,3,10,undefined,
{"yes","no","maybe",undefined,undefined,undefined,undefined,
undefined,undefined,undefined}},
undefined,undefined,undefined,undefined,undefined,undefined,
undefined}}
3> test:dump(Array).
[0,0] a
[0,1] b
[0,2] c
[1,0] 1
[1,1] 2
[1,2] 3
[2,0] "yes"
[2,1] "no"
[2,2] "maybe"
[]
我一直试图在 erlang 中打印出二维数组的元素,但是,因为没有循环,因此没有简单的方法来增加一个变量,更不用说两个了。我已经看到一个或两个递归函数用于制作单个循环,但是,我无法将此代码转换为嵌套循环。这是我一直在使用的代码。
-module(test2).
-export([do_loop/0,loop/1]).
do_loop() ->
loop(0).
loop(10) ->
ok;
loop(Count) ->
io:format("~w~n", [Count]),
loop(Count+1).
感谢任何帮助!
编辑: 这是数组的代码
create( X, Y ) -> array:new( [{size, X}, {default, array:new( [{size, Y}] )}] ).
get( X, Y, Array ) -> array:get( Y, array:get(X, Array) ).
数组模块提供foldl
和foldr
分别从低到高和从高到低折叠数组。
使用 foldl
并递归到二级数组(及以后):
-module(test).
-export([dump/1]).
dump(Array) ->
array:foldl(fun inner_dump/3, [], Array).
转储函数接受数组并开始折叠。 array:foldl
采用折叠函数、初始累加器和要折叠的数组。它依次获取数组的每个元素并调用 FoldFun(Index, Element, Accumulator)
,该调用的 return 值成为新的累加器。对于此函数,我已将累加器定义为父数组中的索引列表。
inner_dump( Index, ArrayOrElement, Previous) ->
case array:is_array(ArrayOrElement) of
false ->
io:format("~p ~p~n", [lists:reverse([Index|Previous]), ArrayOrElement]),
Previous;
true ->
array:foldl(fun inner_dump/3, [Index|Previous], ArrayOrElement),
Previous
end.
这是折叠功能。如果传递的元素不是数组,则将其索引添加到父索引列表中,然后反转该列表并将其与元素一起打印。 (这给出了每个数组的索引,如预期的那样从最外层开始)
如果传递的元素是一个子数组,将其索引添加到父索引列表中并以相同的方式折叠它。
这将允许您打印出任意深度的数组,并且即使每个子数组的大小不同也仍然有效。
下面是一个使用数组 [[a,b,c],[1,2,3],["yes","no","maybe"]]
:
2> Array.
{array,3,0,undefined,
{{array,3,10,undefined,
{a,b,c,undefined,undefined,undefined,undefined,undefined,
undefined,undefined}},
{array,3,10,undefined,
{1,2,3,undefined,undefined,undefined,undefined,undefined,
undefined,undefined}},
{array,3,10,undefined,
{"yes","no","maybe",undefined,undefined,undefined,undefined,
undefined,undefined,undefined}},
undefined,undefined,undefined,undefined,undefined,undefined,
undefined}}
3> test:dump(Array).
[0,0] a
[0,1] b
[0,2] c
[1,0] 1
[1,1] 2
[1,2] 3
[2,0] "yes"
[2,1] "no"
[2,2] "maybe"
[]