2010-07-25 2 views
50

Кажется, что поддержка печатных массивов в Scala несколько отсутствует. Если вы печатаете один, вы получите мусор по умолчанию вы получите в Java:Scala - печатные массивы

scala> val array = Array.fill(2,2)(0)    
array: Array[Array[Int]] = Array(Array(0, 0), Array(0, 0)) 

scala> println(array) 
[[[email protected] 

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

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

ответ

96

В Scala 2.8, вы можете использовать метод deep, определенный на массив, который возвращает IndexedSeq cointaining все (возможно, вложенных) элементов этого массива, и вызвать 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', поэтому я не уверен, дает ли это именно то, что вы хотели.

+0

Или используйте array.deep.foreach (Println), если это может быть большой массив – tgkprog

32

Как об этом:

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

Это потрясающе! Точно как консоль. Кстати, знаете ли вы, как печатать часть типа, например «Array [Array [Int]]» –

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 

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

+2

, он выглядит немного «императивом» со всем, что «foreach» более функционально. – Randomize

1

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

Добавления немного больше ответа 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) 
Смежные вопросы