2010-07-25 29 views
50

Dường như sự hỗ trợ cho mảng in có phần thiếu trong Scala. Nếu bạn in một, bạn sẽ có được rác mặc định, bạn sẽ nhận được trong Java:Scala - mảng in

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

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

Hơn nữa, bạn không thể sử dụng Java toString/deepToString phương pháp từ lớp java.util.Arrays: (hoặc ít nhất là tôi không thể figure it out)

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

giải pháp tốt nhất tôi có thể tìm cho in một mảng 2D là phải làm như sau:

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

có cách nào thành ngữ hơn để làm điều này?

Trả lời

96

Trong Scala 2.8, bạn có thể sử dụng deep phương pháp xác định trên Array, mà trả về một IndexedSeq cointaining tất cả các yếu tố (có thể lồng nhau) của mảng này, và gọi mkString trên rằng:


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) 

Các IndexedSeq trả lại không có một stringprefix 'Array' theo mặc định, vì vậy tôi không chắc chắn cho dù điều này cho chính xác những gì bạn muốn.

+0

Hoặc sử dụng array.deep.foreach (println) nếu nó có thể là một mảng lớn – tgkprog

32

Làm thế nào về điều này:

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

Đây là tuyệt vời! Chính xác như bảng điều khiển. Nhân tiện, bạn có biết cách in phần kiểu, ví dụ, "Array [Array [Int]]" –

1

Các "lập trình chức năng" cách để làm điều này (như xa như tôi lo ngại) là:

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

Hoặc nếu bạn không thực sự quan tâm đến khoảng cách:

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

IMHO, lập trình chức năng có thể nhận được một chút lộn xộn, nếu phải mất quá nhiều thời gian để làm điều này, tôi muốn nói chỉ cần đi wit h cách bắt buộc.

+2

có vẻ hơi "bắt buộc" với tất cả những gì 'foreach' hơn chức năng. – Randomize

1

Bạn có thể nhận dạng gọn gàng của Array [Array [Somethings]] có dải phân cách tùy chỉnh cho khu vực nội cũng như các mảng bên ngoài sau:

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

Điều này dẫn đến:

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

Thêm nhiều hơn để trả lời của Arjan - bạn có thể sử dụng phương thức mkString để in và thậm chí chỉ định dấu phân tách giữa các phần tử. Ví dụ:

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

Hãy thử đơn giản này:

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