English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية

Scala の配列

Scala 言語が提供する配列は固定サイズの同型要素を格納するために使用され、配列はほぼすべてのプログラミング言語で重要なデータ構造の一つです。

配列変数を宣言することは、number0、number1、...、number99 それぞれの変数を宣言するのではなく、numbers などの変数を宣言し、numbers[0]、numbers[1]、...、numbers[99]を使ってそれぞれの変数を表します。配列の特定の要素はインデックスでアクセスされます。

配列の最初の要素のインデックスは0で、最後の要素のインデックスは要素数から1。

配列の宣言

以下は Scala 配列宣言の文法形式です:

var z:Array[String] = new Array[String](3)
または
var z = new Array[String](3)

この文法では、z は文字列型の配列を宣言し、配列の長さが 3 、可保存 3 個の要素。各要素に値を設定し、インデックスを使用して各要素にアクセスすることができます。以下のように表示されます:

z(0) = "w3codebox"; z(1) = "Baidu"; z(4/2) = "Baidu"; z(

) = "Google" 4/2 インデックスとして、以下のように似ています z(2) = "Google"

配列を定義するには以下のような方法もあります:

var z = Array("w3codebox", "Baidu", "Google")

以下は、長さが 10 の配列 myList、インデックス値が 0 から 9:

配列の処理

配列の要素の型と配列のサイズは決まっていますので、配列の要素を処理する際には、基本的な for ループを使用します。

以下の例では、配列の作成、初期化などの処理を示しています:

object Test {
   def main(args: Array[String]) {
      var myList = Array(1.9, 2.9, 3.4, 3.5)
      
      // 全ての配列要素を出力します
      for ( x <- myList ) {
         println( x )
      }
      // 配列の全要素の合計を計算します
      var total = 0.0;
      for ( i <- 0 to (myList.length - 1)) {
         total += myList(i);
      }
      println("合計は " + total);
      // 配列内の最大要素を検索します
      var max = myList(0);
      for ( i <- 1 to (myList.length - 1) ) {
         if (myList(i) > max) max = myList(i);
      }
      println("最大値は " + max);
    
   }
}

以上のコードを実行すると、出力結果は:

$ scalac Test.scala
$ scala Test
1.9
2.9
3.4
3.5
合計は 11.7
最大値は 3.5

多次元配列

多次元配列では、配列の値が別の配列であることがあります。また、別の配列の値も配列であることがあります。行列やテーブルは、私たちがよく見る二次元配列です。

以下は、二次元配列を定義した例です:

val myMatrix = Array.ofDim[Int](3, 3)

例では、配列に三つの配列要素が含まれており、各配列要素には三つの値が含まれています。

次に、二次元配列の処理を完全な例として見てみましょう:

import Array._
object Test {
   def main(args: Array[String]) {
      val myMatrix = Array.ofDim[Int](3, 3)
      
      // 行列を生成します
      for (i <- 0 to 2) {
         for ( j <- 0 to 2) {
            myMatrix(i)(j) = j;
         }
      }
      
      // 二次元配列を印刷します
      for (i <- 0 to 2) {
         for ( j <- 0 to 2) {
            print(" " + myMatrix(i)(j));
         }
         println();
      }
    
   }
}

以上のコードを実行すると、出力結果は:

$ scalac Test.scala
$ scala Test
0 1 2
0 1 2
0 1 2

配列を結合します

以下の例では、concat() メソッドを使用して二つの配列を結合する方法を使用します。concat() メソッドは、複数の配列引数を受け取ります:

import Array._
object Test {
   def main(args: Array[String]) {
      var myList1 = Array(1.9, 2.9, 3.4, 3.5)
      var myList2 = Array(8.9, 7.9、 0.4, 1.5)
      var myList3 = concat( myList1、 myList2)
      
      // 全ての配列要素を出力します
      for ( x <- myList3 ) {
         println( x )
      }
   }
}

以上のコードを実行すると、出力結果は:

$ scalac Test.scala
$ scala Test
1.9
2.9
3.4
3.5
8.9
7.9
0.4
1.5

範囲配列を作成します

以下の例では、range()メソッドを使用して配列の範囲を生成しています。range()メソッドの最後の引数はステップサイズで、デフォルトは 1:

import Array._
object Test {
   def main(args: Array[String]) {
      var myList1 = range(10, 20, 2)
      var myList2 = range(10,20)
      // 全ての配列要素を出力します
      for ( x <- myList1 ) {
         print( " " + x )
      }
      println()
      for ( x <- myList2 ) {
         print( " " + x )
      }
   }
}

以上のコードを実行すると、出力結果は:

$ scalac Test.scala
$ scala Test
10 12 14 16 18
10 11 12 13 14 15 16 17 18 19

Scala配列メソッド

以下のテーブルには、Scala言語で配列を処理する重要なメソッドがあります。使用する前に、 import Array._ パッケージを導入します。

番号メソッドと説明
1

def apply( x: T, xs: T* ): Array[T]

指定されたオブジェクトTの配列を作成します。Tの値はUnit、Double、Float、Long、Int、Char、Short、Byte、Booleanなどです。

2

def concat[T]( xss: Array[T]* ): Array[T]

配列を結合します

3

def copy( src: AnyRef, srcPos: Int, dest: AnyRef, destPos: Int, length: Int ): Unit

配列を一つからもう一つにコピーします。JavaのSystem.arraycopy(src, srcPos, dest, destPos, length)に相当します。

4

def empty[T]: Array[T]

長さが0の配列を返します

5

def iterate[T]( start: T, len: Int )( f: (T) => T ): Array[T]

指定された長さの配列を返します。各配列要素は指定された関数の返値です。

以上の例では配列の初期値は0で、長さは 3、計算関数がa=>a+1

scala> Array.iterate(0,3)(a=>a+1)
res1: Array[Int] = Array(0, 1, 2)
6

def fill[T]( n: Int )(elem: => T): Array[T]

配列を返します。長さは最初の引数で指定され、各要素は第二の引数で埋められます。

7

def fill[T]( n1: Int, n2: Int )( elem: => T ): Array[Array[T]]

指定された長さの二次元配列を返します。各要素は指定された値で埋められます。

8

def ofDim[T]( n1: Int ): Array[T]

指定された長さの配列を作成します

9

def ofDim[T]( n1: Int, n2: Int ): Array[Array[T]]

二次元配列を作成します

10

def ofDim[T]( n1: Int, n2: Int, n3: Int ): Array[Array[Array[T]]]

三次元配列を作成します

11

def range( start: Int, end: Int, step: Int ): Array[Int]

指定された範囲内の配列を作成します。step は各要素間のステップです

12

def range( start: Int, end: Int ): Array[Int]

指定された範囲内の配列を作成します

13

def tabulate[T]( n: Int )(f: (Int)=> T): Array[T]

指定された長さの配列を返します。各要素は指定された関数の返値です。デフォルトでは 0 から始まります。

上記の例では、指定された長さの配列を返します。 3 要素数:

scala> Array.tabulate(3)(a => a + 5)
res0: Array[Int] = Array(5, 6, 7)
14

def tabulate[T]( n1: Int, n2: Int )( f: (Int, Int ) => T): Array[Array[T]]

指定された長さの二次元配列を返します。各要素は指定された関数の返値です。デフォルトでは 0 から始まります。