Scala数组-漂亮地打印N维矩阵

时间:2020-04-09 11:36:57

标签: arrays scala

我想创建一种方法,该方法以预定义的格式打印N个大小的矩阵(预定义的类型,在这种情况下为double并具有N个未知且固定的数组长度)。 例如,在2 * 2 * 2的Double矩阵中,结果应该是

[
    [
        [
            [0.0,0.0], [0.0,0.0]
        ],
        [
            [0.0,0.0], [0.0,0.0]
        ]
    ],
    [
        [
            [0.0,0.0], [0.0,0.0]
        ],
        [
            [0.0,0.0], [0.0,0.0]
        ]
    ]
]

目前,我已经创建了一个这样的方法,该方法没有进行所需的缩进:

 def func(arr: Array[_]):String = {
    var output = for (a <- arr) yield {
      if ( a.isInstanceOf[Double] ) {
        a
      } else {
        func(a.asInstanceOf[Array[_]])
      }
    }
    output.mkString("[", ",", "]")
  }

我使用的方法有效吗?可以使用回调函数吗?你能给我一些提示吗?

1 个答案:

答案 0 :(得分:2)

这里有缩进的工作示例:


 def func(arr: Array[_], pprintDeep:Int = 2, indentation:Int = 0):String = {
    val prefix1 = "  " * indentation
    val prefix2 = prefix1 + "  "

    val output = arr.map {
      case x: Array[_] => func(x, pprintDeep-1, indentation + 1) 
      case other if pprintDeep > 0 => prefix2 + other.toString
      case other => other.toString
    }

    if (pprintDeep > 0) output.mkString(s"$prefix1[\n", ",\n", s"\n$prefix1]")
    else prefix1 + output.mkString(s"[", ",", s"]")
}

好吗?并非最佳选择(将许多字符串连接到位)。如果我们关心性能,则应该使用StringBuilder,但对于不繁重的用例,应该没问题。

关于您的方法的一些评论:

  • a.isInstanceOf[Double]可以工作两次,但是您可以关心更多的类型,这样的if ... else树变得难以阅读和维护。如我的示例所示,将match用于类型。

  • 您假设所有不为double的东西都是Array ...带有风险。使用如上所述匹配的类型。

  • 如果您真的很在意性能,则需要自己对它进行基准测试。您还可以使用将为您打印的现有库之一(例如lihaoyi.com/PPrint、lihaoyi.com/upickle)

  • 工作代码:https://scalafiddle.io/sf/YdGFHce/0

  • 同样适用于字符串的代码:https://scalafiddle.io/sf/YdGFHce/10