Scala-打印数组


71

似乎在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.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))

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

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

有没有更惯用的方法呢?

Answers:


113

在Scala 2.8中,您可以使用deep在Array上定义的方法,该方法返回包含该数组的所有(可能嵌套的)元素的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”,因此我不确定这是否能准确提供所需的内容。


或使用array.deep.foreach(println)(如果它可能是一个大数组)
tgkprog

38

这个怎么样:

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

1
这太棒了!就像控制台一样。顺便说一句,您是否知道如何打印字体部分,例如“ Array [Array [Int]]”
Jing He

17

在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>" 

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)


2

您可以使用内部和外部数组的自定义分隔符对Array [Array [Somethings]]进行整洁的格式化:

    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}}

1

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

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

恕我直言,函数式编程可能会有些混乱,如果要花很长时间才能做到这一点,我想就顺其自然。


3
它看起来foreach比所有功能都“势在必行” 。
随机

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

略微修改rupert160的答案。无需点或括号。


这与两年前rupert160给出的答案有何不同?
jwvh

@jwvh不需要圆点或括号
BSP

1
但是,您的答案中并未包含此类重要且值得注意的信息。
jwvh
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.