Scala - печать массивов - PullRequest
66 голосов
/ 25 июля 2010

Похоже, что поддержка печати массивов в 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 toString / deepToString из класса java.util.Arrays: (или, по крайней мере, я не могу понять это)

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

Есть ли более идиоматический способ сделать это?

Ответы [ 7 ]

110 голосов
/ 25 июля 2010

В 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', поэтому я не уверен, дает ли это именно то, что вы хотели.

36 голосов
/ 25 июля 2010

Как насчет этого:

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))
12 голосов
/ 02 сентября 2015

Добавим немного больше к ответу Арджана - вы можете использовать метод 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>" 
5 голосов
/ 25 апреля 2017

Попробуйте просто так:

  // 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 голосов
/ 07 мая 2018

Мне скорее нравится этот:

Array(1, 7, 2, 9).foreach(println)
1 голос
/ 26 ноября 2012

Вы можете получить аккуратное форматирование массива [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 голос
/ 27 июля 2010

Способ «функционального программирования» для этого (насколько я понимаю):

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

ИМХО, функциональное программирование может стать немного запутанным, если это займет слишком много времени, я бы сказал, просто следуйте императивному пути.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...