Scala 打印数组

Scala 似乎缺乏对打印数组的支持。如果你打印一个,你会得到 Java 中默认的垃圾:

scala> val array = Array.fill(2,2)(0)
array: Array[Array[Int]] = Array(Array(0, 0), Array(0, 0))


scala> println(array)
[[I@d2f01d

此外,不能使用 Java.util 中的 JavatoString/deep ToString 方法。数组类: (或者至少我不能算出来)

scala> println(java.util.Arrays.deepToString(array))
<console>:7: error: type mismatch;
found   : Array[Array[Int]]
required: Array[java.lang.Object]
println(java.util.Arrays.deepToString(array))

我所能找到的打印2D 数组的最佳解决方案是执行以下操作:

scala> println(array.map(_.mkString(" ")).mkString("\n"))
0 0
0 0

还有比这更惯用的方法吗?

81867 次浏览

在 Scala 2.8中,您可以使用在 Array 上定义的 deep方法,它返回一个 IndexedSeq,其中包含这个数组的所有元素(可能是嵌套的) ,并在这个方法上调用 mkString:


scala> val array = Array.fill(2,2)(0)
array: Array[Array[Int]] = Array(Array(0, 0), Array(0, 0))


scala> println(array.deep.mkString("\n"))
Array(0, 0)
Array(0, 0)

默认情况下,IndexedSeq 返回的确有一个字符串前缀‘ Array’,所以我不确定这是否准确地给出了您想要的结果。

这样吧:

scala> val array = Array.fill(2,2)(0)
array: Array[Array[Int]] = Array(Array(0, 0), Array(0, 0))


scala> import scala.runtime.ScalaRunTime._
import scala.runtime.ScalaRunTime._


scala> val str = stringOf(array)
str: String =
Array(Array(0, 0), Array(0, 0))

这样做的“函数式编程”方法(就我而言)是:

scala> array foreach{case a => a foreach {b => print(b.toString + " ")}; print('\n')}
0 0
0 0

或者如果你真的不在乎间距:

scala> array foreach{a => a foreach println}
0
0
0
0

恕我直言,函数式编程可能会有点混乱,如果它花费太长的时间,我会说只是去命令式的方式。

你可以使用内部和外部数组的自定义分隔符来获得 Array [ Array [ Something ]]的整洁格式如下:

    def arrayToString(a: Array[Array[Int]]) : String = {
val str = for (l <- a) yield l.mkString("{", ",", "}")
str.mkString("{",",\n","}")
}


val foo = Array.fill(2,2)(0)
println(arrayToString(foo))

结果是:

    \{\{0,0},
{0,0}}

为 Arjan 的答案添加更多内容——您可以使用 mkString 方法来打印,甚至指定元素之间的分隔符。 例如:

val a = Array(1, 7, 2, 9)
a.mkString(" and ")
// "1 and 7 and 2 and 9"
a.mkString("<", ",", ">") //mkString(start: String, sep: String, end: String)
// "<1,7,2,9>"

试试这个简单的方法:

  // create an array
val array1 = Array(1,2,3)
// print an array elements seperated by comma
println(array1.mkString(","))
// print an array elements seperated by a line
println(array1.mkString("\n"))


// create a function
def printArray[k](a:Array[k])= println(a.mkString(","))
printArray(array1)

我比较喜欢这个:

Array(1, 7, 2, 9).foreach(println)
Array(1, 7, 2, 9) foreach println

对 Rupert160的回答稍作修改,不需要点或括号。