Scala - Druckarrays

71

Es scheint, dass die Unterstützung für das Drucken von Arrays in Scala etwas fehlt. Wenn Sie einen drucken, erhalten Sie den Standardmüll, den Sie in Java erhalten würden:

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

scala> println(array)
[[I@d2f01d

Darüber hinaus können Sie die Java toString / deepToString-Methoden aus der Klasse java.util.Arrays nicht verwenden: (oder zumindest kann ich es nicht herausfinden)

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

Die beste Lösung zum Drucken eines 2D-Arrays besteht darin, Folgendes zu tun:

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

Gibt es eine idiomatischere Möglichkeit, dies zu tun?

Viel
quelle

Antworten:

113

In Scala 2.8 können Sie die deepin Array definierte Methode verwenden, die einen IndexedSeq zurückgibt, der alle (möglicherweise verschachtelten) Elemente dieses Arrays enthält, und dafür mkString aufrufen:


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)

Der zurückgegebene IndexedSeq hat standardmäßig das Zeichenfolgenpräfix 'Array', daher bin ich mir nicht sicher, ob dies genau das liefert, was Sie wollten.

Arjan Blokzijl
quelle
Oder verwenden Sie array.deep.foreach (println), wenn es sich um ein großes Array handeln könnte
tgkprog
38

Wie wäre es damit:

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))
Eastsun
quelle
1
Das ist fantastisch! Genau wie die Konsole. Übrigens, wissen Sie, wie man den Typteil druckt, zum Beispiel "Array [Array [Int]]"
Jing He
17

Hinzufügen von etwas mehr zu Arjans Antwort - Sie können die mkString-Methode verwenden, um das Trennzeichen zwischen Elementen zu drucken und sogar anzugeben. Zum Beispiel :

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>" 
Akuriako
quelle
6

Versuchen Sie einfach Folgendes:

  // 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)
Noha Elprince
quelle
3

Ich mag dieses eher:

Array(1, 7, 2, 9).foreach(println)
rupert160
quelle
2

Sie können eine saubere Formatierung von Array [Array [Somethings]] mit benutzerdefinierten Trennzeichen für das innere und das äußere Array erhalten:

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

Das führt zu:

    {{0,0},
    {0,0}}
David Weber
quelle
1

Die "funktionale Programmierung", um dies zu tun (soweit es mich betrifft), ist:

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

Oder wenn Ihnen der Abstand nicht wirklich wichtig ist:

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

IMHO, funktionale Programmierung kann ein wenig chaotisch werden, wenn es zu lange dauert, um dies zu machen, würde ich sagen, gehen Sie einfach mit dem zwingenden Weg.

Enrico Susatyo
quelle
3
es sieht ein bisschen "zwingend" aus mit all dem, was foreachmehr als funktional ist.
Randomize
0
Array(1, 7, 2, 9) foreach println

Kleinere Änderung der Antwort von rupert160. Keine Punkte oder Klammern erforderlich.

BSP
quelle
Wie unterscheidet sich das von der Antwort, die rupert160 vor über 2 Jahren gegeben hat?
JWVH
@jwvh keine Punkte oder Klammern erforderlich
BSP
1
Und doch waren solche wichtigen und bemerkenswerten Informationen nicht in Ihrer Antwort enthalten.
JWVH