Scala-tableaux d'impression
Il semble que le support pour l'impression de tableaux manque quelque peu dans Scala. Si vous en imprimez un, vous obtenez la poubelle par défaut que vous obtiendriez en Java:
scala> val array = Array.fill(2,2)(0)
array: Array[Array[Int]] = Array(Array(0, 0), Array(0, 0))
scala> println(array)
[[I@d2f01d
De plus, vous ne pouvez pas utiliser les méthodes Java ToString/Deeptostring de java.util.Classe Arrays: (ou du moins je ne peux pas le comprendre)
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 j'ai pu trouver pour imprimer un tableau 2D est de faire ce qui suit:
scala> println(array.map(_.mkString(" ")).mkString("n"))
0 0
0 0
Y a-t-il une façon plus idiomatique de faire cela?
7 réponses
Dans Scala 2.8, vous pouvez utiliser la méthode deep
définie sur Array, qui renvoie un indexedseq cointaining tous les éléments (éventuellement imbriqués) de ce tableau, et appeler mkString sur cela:
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 'tableau' stringprefix par défaut, donc je ne suis pas sûr si cela donne exactement ce que vous vouliez.
Que diriez-vous de 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))
Ajouter 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>"
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)
La méthode de " programmation fonctionnelle "pour le faire (en ce qui me 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 vous souciez pas vraiment de l'espacement:
scala> array foreach{a => a foreach println}
0
0
0
0
À mon humble avis, la programmation fonctionnelle peut devenir un peu désordonnée, si cela prend trop de temps pour le faire, je dirais juste aller avec la manière impérative.
Vous pouvez obtenir un formatage soigné de Array [Array[Somethings]] avec des séparateurs personnalisés pour le tableau interne ainsi que le tableau externe 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}}