S-JIS[2010-10-23/2012-04-08] 変更履歴
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; |
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?