打印 Array2 二维字符数组
Print Array2 2D char array
我正在尝试在 SML 中打印一个二维字符数组,其形式为:
val arr = Array2.fromList [[#"a", #"b", #"c"], [#"d", #"e", #"f"], [#"g", #"h", #"i"]];
请注意,每行的最后一个元素 不是 一个 #"\n"
元素。
结果必须采用以下形式,其中每一行都用新行表示:
abc
def
ghi
在 SML 中有什么方法可以做到这一点吗?
你可以写一个函数如下:
fun print_arr (arr,N,col) = ()
| print_arr(arr,row,M) = (print("\n");print_arr(arr,row+1,0))
| print_arr(arr,row,col) = (print(Array.sub(arr,row,col)); print_arr(arr,row,col+1))
注意N,M分别是行数和列数。在这里你递归地打印每个元素。当你到达一行的末尾时,你打印一个新行,然后你调用该函数并将下一行作为参数。你的初始参数应该是 (arr,0,0).
您可以使用 Array2.row
, Array2.nRows
and CharVector.tabulate
:
一次迭代并打印一整行
Array2.row : 'a array * int -> 'a Vector.vector
Array2.nRows : 'a array -> int
CharVector.tabulate : int * (int -> char) -> string
您可以定义一个函数 app_row
,它接受一个 Array2.array
并在每一行上调用一个函数 f
,提取为一个向量。一个函数 vec_to_str
接受该向量 vec
并将其转换为 字符串 ;然后打印出来。
fun app_row f arr =
let fun loop i = if i = Array2.nRows arr then ()
else (f (Array2.row (arr, i)); loop (i+1))
in loop 0 end
fun vec_to_str vec =
CharVector.tabulate (Vector.length vec, fn i => Vector.sub (vec, i))
fun showMatrix arr =
app_row (fn row => print (vec_to_str row ^ "\n")) arr
试穿尺码:
- showMatrix arr;
abc
def
ghi
> val it = () : unit
此解决方案的强度 I/O 应该低于例如使用 Array2.appi
并一次打印每个字母。它也稍微复杂一些,因为它涉及将“char Vector.vector”转换为“CharVector.vector”(又名一个 字符串 )。 (两者之间的区别很微妙。)
仍然是一个类似于 P. Antoniadis 解决方案的替代解决方案,但您不需要指定尺寸(因为它们可以使用 Array2.nCols
和 Array2.nRows
等方法提取) :
fun showMatrix arr =
Array2.appi Array2.RowMajor (fn (_, col, c) =>
print (str c ^ (if col + 1 = Array2.nCols arr then "\n" else "" )))
{base=arr,row=0,col=0,nrows=NONE,ncols=NONE}
我正在尝试在 SML 中打印一个二维字符数组,其形式为:
val arr = Array2.fromList [[#"a", #"b", #"c"], [#"d", #"e", #"f"], [#"g", #"h", #"i"]];
请注意,每行的最后一个元素 不是 一个 #"\n"
元素。
结果必须采用以下形式,其中每一行都用新行表示:
abc
def
ghi
在 SML 中有什么方法可以做到这一点吗?
你可以写一个函数如下:
fun print_arr (arr,N,col) = ()
| print_arr(arr,row,M) = (print("\n");print_arr(arr,row+1,0))
| print_arr(arr,row,col) = (print(Array.sub(arr,row,col)); print_arr(arr,row,col+1))
注意N,M分别是行数和列数。在这里你递归地打印每个元素。当你到达一行的末尾时,你打印一个新行,然后你调用该函数并将下一行作为参数。你的初始参数应该是 (arr,0,0).
您可以使用 Array2.row
, Array2.nRows
and CharVector.tabulate
:
Array2.row : 'a array * int -> 'a Vector.vector
Array2.nRows : 'a array -> int
CharVector.tabulate : int * (int -> char) -> string
您可以定义一个函数 app_row
,它接受一个 Array2.array
并在每一行上调用一个函数 f
,提取为一个向量。一个函数 vec_to_str
接受该向量 vec
并将其转换为 字符串 ;然后打印出来。
fun app_row f arr =
let fun loop i = if i = Array2.nRows arr then ()
else (f (Array2.row (arr, i)); loop (i+1))
in loop 0 end
fun vec_to_str vec =
CharVector.tabulate (Vector.length vec, fn i => Vector.sub (vec, i))
fun showMatrix arr =
app_row (fn row => print (vec_to_str row ^ "\n")) arr
试穿尺码:
- showMatrix arr;
abc
def
ghi
> val it = () : unit
此解决方案的强度 I/O 应该低于例如使用 Array2.appi
并一次打印每个字母。它也稍微复杂一些,因为它涉及将“char Vector.vector”转换为“CharVector.vector”(又名一个 字符串 )。 (两者之间的区别很微妙。)
仍然是一个类似于 P. Antoniadis 解决方案的替代解决方案,但您不需要指定尺寸(因为它们可以使用 Array2.nCols
和 Array2.nRows
等方法提取) :
fun showMatrix arr =
Array2.appi Array2.RowMajor (fn (_, col, c) =>
print (str c ^ (if col + 1 = Array2.nCols arr then "\n" else "" )))
{base=arr,row=0,col=0,nrows=NONE,ncols=NONE}