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?

58
demandé sur I82Much 2010-07-25 09:02:46

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.

103
répondu Arjan Blokzijl 2010-07-25 05:16:22

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))
33
répondu Eastsun 2010-07-25 09:45:08

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>" 
11
répondu akuriako 2015-10-06 22:23:36

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)
5
répondu Noha Elprince 2017-04-25 14:10:06

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.

1
répondu Enrico Susatyo 2010-07-27 04:03:01

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}}
1
répondu David Weber 2012-11-26 10:05:33

J'aime plutôt celui-ci:

Array(1, 7, 2, 9).foreach(println)
0
répondu rupert160 2018-05-07 11:24:01