代码之家  ›  专栏  ›  技术社区  ›  StrikeLeader

打印数组2 2D字符数组

  •  1
  • StrikeLeader  · 技术社区  · 6 年前

    我正在尝试在SML中打印2D字符数组,其形式为:

    val arr = Array2.fromList [[#"a", #"b", #"c"], [#"d", #"e", #"f"], [#"g", #"h", #"i"]];
    

    请注意,每行中的最后一个元素 不是 #"\n" 要素

    结果必须采用以下形式,其中每一行都用新行表示:

    abc
    def
    ghi
    

    在SML中有什么方法可以做到这一点吗?

    2 回复  |  直到 6 年前
        1
  •  1
  •   sshine    6 年前

    您可以使用 Array2.row , Array2.nRows 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 然后一次打印一封信。它也稍微复杂一些,因为它涉及转换“ 字符向量。矢量 “转换为” CharVector。矢量 “(又名a 一串 )(两者之间的区别很细微。)

    尽管如此,一种类似于P.Antoniadis解决方案的替代解决方案,但您不需要指定尺寸(因为它们可以使用例如。 Array2.nCols 阵列2。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}
    
        2
  •  1
  •   Panos Antoniadis    6 年前

    可以按如下方式编写函数:

    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 )。