2010-07-25 15 views
50

Parece que el soporte para la impresión de matrices es algo que falta en Scala. Si imprime una, se obtiene la basura por defecto se obtendría en Java:Scala - matrices de impresión

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

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

Por otra parte, no puede utilizar los métodos deepToString/Java toString de la clase java.util.Arrays: (o al menos yo no puedo averiguarlo)

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

la mejor solución que pude encontrar para imprimir una matriz 2D es hacer lo siguiente:

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

¿hay una manera más idiomática de hacer esto?

Respuesta

96

En Scala 2.8, se puede utilizar el método deep definido en Array, que devuelve un IndexedSeq cointaining todos los elementos (posiblemente anidada) de esta matriz, y llamar a mkString en que:


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) 

El IndexedSeq devuelto tiene un stringprefix 'Array' por defecto, así que no estoy seguro de si esto da exactamente lo que quería.

+0

O utilice array.deep.foreach (println) si podría ser una gran variedad – tgkprog

32

¿Qué tal esto:

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

Esto es increíble! Exactamente como la consola. Por cierto, ¿sabes cómo imprimir la parte de tipo, por ejemplo, "Array [Array [Int]]" –

1

La forma "programación funcional" para hacer esto (por lo que Concierno) es:

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

O si usted realmente no se preocupan por la espaciamiento:

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

en mi humilde opinión, la programación funcional puede ser un poco desordenado, si se tarda demasiado tiempo para hacer esto, yo diría que sólo tiene que ir ingenio h la forma imperativa.

+2

parece un poco "imperativo" con todo lo que 'foreach'es más que funcional. – Randomize

1

Puede obtener ordenada formato de Array [Array [Somethings]] con separadores personalizados para el interior, así como la matriz exterior sigue:

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

Esto se traduce en:

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

Adición Poco más a la respuesta de Arjan: puede usar el método mkString para imprimir e incluso especificar el separador entre los elementos. Por ejemplo:

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

Trate simplemente esto:

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