Scala - 打印数组

声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow 原文地址: http://stackoverflow.com/questions/3328085/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me): StackOverFlow

提示:将鼠标放在中文语句上可以显示对应的英文。显示中英文
时间:2020-10-22 02:18:50  来源:igfitidea点击:

Scala - printing arrays

scala

提问by I82Much

It seems like the support for printing arrays is somewhat lacking in Scala. If you print one, you get the default garbage you'd get in Java:

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

Furthermore, you cannot use the Java toString/deepToString methods from the java.util.Arrays class: (or at least I cannot figure it out)

此外,您不能使用 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))

The best solution I could find for printing a 2D array is to do the following:

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

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

Is there a more idiomatic way of doing this?

有没有更惯用的方法来做到这一点?

回答by Arjan Blokzijl

In Scala 2.8, you can use the deepmethod defined on Array, that returns an IndexedSeq cointaining all of the (possibly nested) elements of this array, and call mkString on that:

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

The IndexedSeq returned does have a stringprefix 'Array' by default, so I'm not sure whether this gives precisely what you wanted.

默认情况下,返回的 IndexedSeq 确实有一个 stringprefix 'Array',所以我不确定这是否正是您想要的。

回答by Eastsun

How about this:

这个怎么样:

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

回答by akuriako

Adding little more to Arjan's answer - you can use the mkString method to print and even specify the separator between elements. For instance :

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

回答by Noha Elprince

Try simply this:

试试这个:

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

回答by rupert160

I rather like this one:

我比较喜欢这个:

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

回答by David Weber

You can get neat formatting of Array[Array[Somethings]] with custom separators for the inner as well as the outer array follows:

您可以使用内部和外部数组的自定义分隔符获得 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))

This results in:

这导致:

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

回答by Enrico Susatyo

The "functional programming" way to do this (as far as I concern) is:

执行此操作的“函数式编程”方式(就我而言)是:

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

Or if you don't really care about the spacing:

或者,如果您真的不关心间距:

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

IMHO, functional programming can get a little messy, if it takes too long to make this, I'd say just go with the imperative way.

恕我直言,函数式编程可能会变得有点混乱,如果需要很长时间才能做到这一点,我会说只是采用命令式方式。