2010-07-25 14 views
50

Scala'da baskı dizileri için destek eksik görünüyor. Eğer java.util.Arrays sınıfından Java toString/deepToString yöntemleri kullanamaz, AyrıcaScala - matbaa dizileri

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

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

: Eğer birini yazdırmak, size Java almak istediğiniz varsayılan çöp almak (veya en azından Yapamam bunu yapmanın daha deyimsel yolu

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

var mı:

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

Ben 2D dizi yazdırmak için bulabildiğim en iyi çözüm aşağıdaki yapmaktır) dışarı rakam?

cevap

96

Scala 2.8 olarak, bu dizinin (muhtemelen iç içe) bütün elemanları cointaining bir IndexedSeq döner Array tanımlanan deep yöntemi kullanabilir ve bu konuda mkString çağırır:


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) 

IndexedSeq döndürülmüş varsayılan olarak 'String' stringprefix var, bu yüzden tam olarak ne istediğinizi verdiğinden emin değilim.

+0

Ya da büyük bir dizi – tgkprog

32

bu konuda nasıl

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

Yoksa gerçekten yoksa umurumda:

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

olabilseydim (println) array.deep.foreach kullanmak bu harika! Tam olarak konsol gibi. Bu arada, tür parçasının nasıl yazdırılacağını biliyorsunuz, örneğin, "Array [Array [Int]]" –

1

(bildiğim kadarıyla endişe gibi) Bunu yapmak için "işlevsel programlama" yoludur aralık: Bu yapmak için çok uzun sürerse

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

IMHO, fonksiyonel programlama, biraz dağınık alabilirsiniz, sadece espri gitmek derim h zorunlu yol.

+2

, "foreach" işlevinin işlevselliğinden daha fazlası ile biraz "zorunluluk" gösteriyor. – Randomize

1

Sen Array düzgün biçimlendirme alabilirsiniz [Dizi [Birşeyler]] özel iç için ayırıcılar yanı sıra dış dizi izler:

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

ekleme:

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

Bu sonuçlanır Arjan'ın cevabının biraz daha fazlası - mkString yöntemini kullanarak elemanlar arasındaki ayırıcıyı yazdırabilir ve hatta belirtebilirsiniz. Örneğin :

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

sadece bu deneyin:

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