S-JIS[2010-10-23/2012-04-08] 変更履歴

Scala配列

Scalaの配列のメモ。
(Scalaでは配列よりもSeqの方が重要なようだ)


配列の宣言方法

Scalaでは、配列はArrayクラスで宣言する。
(C言語やJavaの配列のような、配列宣言専用の文法は無い)

Scala Java 備考
var a: Array[Int] = null
a = new Array[Int](10)
a = new Array(10)
int[] a = null;
a = new int[10];
変数だけ先に宣言し、
実体は後から定義する例。
val a = new Array[Int](10)
final int[] a = new int[10];
変数宣言と同時に実体を定義する例。
val a = Array(1, 2, 3)
final int[] a = { 1, 2, 3 };
final int[] a = new int[]{ 1, 2, 3 };
初期値を与える例。
「new」でない理由

要素の使用方法

配列内の各要素を取得・設定するには、丸括弧「()」で要素番号を指定する。
(Javaでは角括弧「[]」で要素番号を指定する)

Scala Java 備考
a(0) = 123
a[0] = 123;
要素への代入。
val e = a(0)
final int e = a[0];
要素の取得。
val size = a.length
val size = a.size
final int size = a.length;
要素数の取得。
for (i <- 0 to a.length - 1) {
  println(a(i))
}
for (i <- 0 until a.length) {
  println(a(i))
}
for (int i = 0; i < a.length; i++) {
  System.out.println(a[i]);
}
添字を使ったループ。
(Scalaでは非推奨の方法)
for (e <- a) {
  println(e)
}
a.foreach{ e=> println(e) }
a.foreach{ println(_) }
a.foreach(println)
for (int e : a) {
  System.out.println(e);
}
要素を直接取り出すループ。
a1.sameElements(a2)
Arrays.equals(a1 ,a2)
配列の比較。[2011-01-27]
シンプルな配列(一次元配列)でのみ使用可能。
(Scalaの配列では==演算子で比較するとfalseになる)

多次元配列

n次元配列は配列の配列として扱う(Javaと同様)。[2012-04-08]

Scala Java 備考
val a = Array.ofDim[Int](10, 9)
val b = Array.ofDim[Int](2, 3, 4)
int[][] a = new int[10][9];
int[][][] b = new int[2][3][4];
aの型はArray[Array[Int]]
bの型はArray[Array[Array[Int]]]
a(0)(0) = 1
a(9)(8) = 2
b(1)(2)(3) = 3
a[0][0] = 1;
a[9][8] = 2;
b[1][2][3] = 3;
 

参考: ツイート1ツイート2


要素指定に丸括弧を使う意味

Scalaでは配列の要素を指定するのに丸括弧を使用しているが、実はこれはメソッド呼び出しだから。[2010-12-12]

値を取得する「a(n)」は、apply()メソッドの呼び出しである。(applyという名前のメソッドを呼び出すときは、メソッド名を省略できる)

scala> val a = Array("a","b","c")
a: Array[java.lang.String] = Array(a, b, c)

scala> a(1)
res0: java.lang.String = b

scala> a.apply(1)
res1: java.lang.String = b

引数が1個しかないメソッドでは丸括弧の代わりにとげ括弧が使えるから、以下のような書き方も出来る
scala> a{1}
res2: java.lang.String = b

値を更新する「a(n) = v」は、update()メソッドの呼び出しである。

scala> a(1) = "zzz"

scala> a
res4: Array[java.lang.String] = Array(a, zzz, c)

scala> a.update(1, "ZZZ")

scala> a
res6: Array[java.lang.String] = Array(a, ZZZ, c)

なんか、とげ括弧でも出来るし!
scala> a{1} = "z"

scala> a
res8: Array[java.lang.String] = Array(a, z, c)

配列の比較

Scalaでは==演算子によって内容が等しいかどうかを判定できるのだが、配列では出来ない。[2011-03-23]
他の方法を使う必要がある。

val a1 = Array(〜)
val a2 = 同上
Array(1,2,3) Array(Array(1,2), Array(3,4)) 備考
a1 == a2 false false  
a1 eq a2 false false  
a1 sameElements a2 true false  
WrappedArray.make(a1) == WrappedArray.make(a2) true false 参考:hydroculさんのツイート [2011-07-03]
a1.deep == a2.deep true true  

参考: How do I compare two arrays in scala?


Scala目次へ戻る / 技術メモへ戻る
メールの送信先:ひしだま