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?

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.


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

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

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)


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

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.


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.


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
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.