Подтвердить что ты не робот

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)
[[[email protected]

Кроме того, вы не можете использовать методы 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

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

4b9b3361

Ответ 1

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

Ответ 2

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

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

Ответ 3

Добавляя немного больше ответа 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>" 

Ответ 4

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

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

Ответ 5

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

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

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

Ответ 6

Вы можете получить аккуратное форматирование 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}}