Scala - 打印阵列

I82*_*uch 69 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
Run Code Online (Sandbox Code Playgroud)

此外,您不能使用java.util.Arrays类中的Java toString/deepToString方法:(或者至少我无法弄清楚)

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))
Run Code Online (Sandbox Code Playgroud)

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

scala> println(array.map(_.mkString(" ")).mkString("\n"))
0 0
0 0
Run Code Online (Sandbox Code Playgroud)

有没有更惯用的方法呢?

Arj*_*ijl 111

在Scala 2.8中,您可以使用deepArray上定义的方法,该方法返回一个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)
Run Code Online (Sandbox Code Playgroud)

返回的IndexedSeq默认有一个stringprefix'Array',所以我不确定这是否恰好提供了你想要的.


Eas*_*sun 36

这个怎么样:

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))
Run Code Online (Sandbox Code Playgroud)


aku*_*ako 15

为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>" 
Run Code Online (Sandbox Code Playgroud)


Noh*_*nce 6

试试这个:

  // 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)
Run Code Online (Sandbox Code Playgroud)