我想创建一种方法,该方法以预定义的格式打印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("[", ",", "]")
}
我使用的方法有效吗?可以使用回调函数吗?你能给我一些提示吗?
答案 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)