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
Есть ли более идиоматический способ сделать это?
Ответы
Ответ 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}}