1. 概要

このチュートリアルでは、ScalaでArrayのコンテンツを印刷するためのさまざまなアプローチを学びます。

2. Scalaの配列

Array の内容をscalaで印刷しようとすると、驚きます。

scala> val a = Array(1,2,3) 
val a: Array[Int] = Array(1, 2, 3) 

scala> println(a) 
[I@249a45fd

実際の内容ではなく、奇妙なものが印刷されていることがわかります。 ただし、 Lists Sets 、または Mapsprintln メソッドを使用しようとすると、すべてが期待どおりに機能します。

scala> val l = List(1,2,3)
println(val l: List[Int] = List(1, 2, 3)

scala> println(l)
List(1, 2, 3)

scala> val s = Set(1,2,3)
val s: Set[Int] = Set(1, 2, 3)

scala> println(s)
Set(1, 2, 3)

scala> val m = Map(1 -> "a", 2 -> "b", 3 -> "c")
val m: Map[Int, String] = Map(1 -> a, 2 -> b, 3 -> c)

scala> println(m)
Map(1 -> a, 2 -> b, 3 -> c)

では、 Array はどうなるのでしょうか。また、他のコレクションと同じようにコンテンツがうまく印刷されないのはなぜですか。

List Set 、および Map は実際のScalaコレクションですが、 Arrayタイプは、Javaネイティブ配列と同等のScalaです(例: 、 String [] は、 Strings のネイティブ配列を表します)。 したがって、配列の内容を出力しようとすると、 Array.toString メソッドで定義されているものがすべて取得されます(通常はオブジェクト hashcode ですが、プラットフォームによって異なります)。

いくつかの回避策を見てみましょう。

3. ループの使用

最も単純な解決策は、配列要素を繰り返し処理し、それらの各を印刷することです。

scala> val a = Array(1,2,3)
val a: Array[Int] = Array(1, 2, 3)

scala> a.foreach(println)
1
2
3

各要素を異なる行に出力したくない場合は、代わりにprintまたはprintfメソッドを使用できます。

4. mkStringを使用する

利用できるもう1つの便利なメソッドは、オブジェクトのようなほとんどすべてのscalaコレクションに存在するmkStringメソッドです。

scala> a.mkString
val res1: String = 123

mkString メソッドは、出力を変更する場合、カスタムセパレーターも受け入れます。

scala> a.mkString(",")
val res2: String = 1,2,3

scala> a.mkString(", ")
val res3: String = 1, 2, 3

5. Scalaコレクションへの変換

パフォーマンスの高いソリューションではないかもしれませんが、配列をscalaコレクションに変換するだけで、うまく印刷できます。 リストは最も同等のコレクションです。

scala> val l = a.toList
val l: List[Int] = List(1, 2, 3)

scala> println(l)
List(1, 2, 3)

6. ScalaRunTime.replStringOfを使用する

ほとんどの開発者がなじみのない別の解決策があります。 ScalaRunTimeオブジェクトを使用できます。

scala> runtime.ScalaRunTime.replStringOf(a, a.length)
val res5: String = "Array(1, 2, 3)
"

7. 結論

この記事では、 Array の内容を印刷することが見た目ほど明白ではない理由と、そのためのいくつかの解決策を調査しました。