2010-07-25 7 views
50

Il semble que le support des matrices d'impression manque quelque peu dans Scala. Si vous imprimez un, vous obtenez la poubelle par défaut que vous obtiendriez en Java:Scala - matrices d'impression

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

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

De plus, vous ne pouvez pas utiliser les méthodes Java toString/deepToString de la classe java.util.Arrays: (ou du moins je ne peux pas figure it out)

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 meilleure solution que je pourrais trouver pour l'impression d'un tableau 2D est de faire ce qui suit:

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

est-il un moyen plus idiomatiques de le faire?

Répondre

96

Scala 2.8, vous pouvez utiliser la méthode deep définie sur Array, qui renvoie une IndexedSeq cointaining tous les éléments (éventuellement imbriqués) de ce tableau, et appelez mkString sur ce point:


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) 

Le IndexedSeq retourné a un préfixe de chaîne 'Array' par défaut, donc je ne suis pas sûr que cela donne précisément ce que vous vouliez.

+0

Ou utilisez array.deep.foreach (println) si elle pourrait être un grand tableau – tgkprog

32

Que diriez-vous ceci:

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

C'est génial! Exactement comme la console. Par ailleurs, savez-vous comment imprimer la partie type, par exemple, "Array [Array [Int]]" –

1

La façon de le faire « programmation fonctionnelle » (pour autant que je concerne) est la suivante:

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

Ou si vous ne se soucient pas vraiment de la espacement:

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

à mon humble avis, la programmation fonctionnelle peut être un peu en désordre, si elle prend trop de temps pour faire cela, je dirais juste aller esprit h le chemin impératif.

+2

il semble un peu "impératif" avec tout ce que 'foreach'es plus que fonctionnel. – Randomize

1

Vous pouvez obtenir la mise en forme propre de Array [Array [Somethings]] avec des séparateurs personnalisés pour l'intérieur ainsi que le tableau extérieur suit:

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

Il en résulte:

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

Ajout un peu plus à la réponse d'Arjan - vous pouvez utiliser la méthode mkString pour imprimer et même spécifier le séparateur entre les éléments. Par exemple:

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

Essayez simplement ceci:

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