Scala List(リスト)

Scala 集合Scala コレクション

Scala のリストは配列に似ています。すべての要素の型が同じですが、異なる点もあります。リストは不変であり、値が一度定義されると変更できません。また、リストは再帰的な構造(つまりリンクリスト構造)を持ちますが、配列はそうではありません。

リストの要素型 T は List[T] と書くことができます。例えば、以下にさまざまな型のリストを示します。

実例

// 文字列リスト
val site: List[String] = List("サンプル", "Google", "Baidu")

// 整数型リスト
val nums: List[Int] = List(1, 2, 3, 4)

// 空リスト
val empty: List[Nothing] = List()

// 2次元リスト
val dim: List[List[Int]] =
   List(
      List(1, 0, 0),
      List(0, 1, 0),
      List(0, 0, 1)
   )

リストを構築する2つの基本単位は、Nilと::

Nil空のリストとして表すこともできます。

上記の例は次のように書くことができます:

実例

// 文字列リスト
val site = "サンプル" :: ("Google" :: ("Baidu" :: Nil))

// 整数型リスト
val nums = 1 :: (2 :: (3 :: (4 :: Nil)))

// 空リスト
val empty = Nil

// 2次元リスト
val dim = (1 :: (0 :: (0 :: Nil))) ::
          (0 :: (1 :: (0 :: Nil))) ::
          (0 :: (0 :: (1 :: Nil))) :: Nil

リストの基本操作

Scala のリストには3つの基本操作があります:

  • headリストの最初の要素を返します
  • tail最初の要素以外の要素を含むリストを返します
  • isEmptyリストが空の場合に true を返します

Scala のリストに対するあらゆる操作は、これら3つの基本操作を使って表現できます。例は次のとおりです。

実例

// 文字列リスト
object Test {
   def main(args: Array[String]) {
      val site = "サンプル" :: ("Google" :: ("Baidu" :: Nil))
      val nums = Nil

      println( "最初のサイトは : " + site.head )
      println( "最後のサイトは : " + site.tail )
      println( "リスト site が空かどうか : " + site.isEmpty )
      println( "nums が空かどうか : " + nums.isEmpty )
   }
}

上記のコードを実行すると、出力結果は次のとおりです。

$ vim Test.scala 
$ scala Test.scala 
第一网站是 : サンプル
最后一个网站是 : List(Google, Baidu)
查看列表 site 是否为空 : false
查看 nums 是否为空 : true

リストの連結

あなたは使用できます:::演算子、またはList.:::()メソッド、またはList.concat()メソッドを使用して2つ以上のリストを連結できます。例は次のとおりです。

実例

object Test {
   def main(args: Array[String]) {
      val site1 = "サンプル" :: ("Google" :: ("Baidu" :: Nil))
      val site2 = "Facebook" :: ("Taobao" :: Nil)

      // ::: 演算子を使用
      var fruit = site1 ::: site2
      println( "site1 ::: site2 : " + fruit )
     
      // List.:::() メソッドを使用
      fruit = site1.:::(site2)
      println( "site1.:::(site2) : " + fruit )

      // concat メソッドを使用
      fruit = List.concat(site1, site2)
      println( "List.concat(site1, site2) : " + fruit  )
     

   }
}

上記のコードを実行すると、出力結果は次のとおりです。

$ vim Test.scala 
$ scala Test.scala 
site1 ::: site2 : List(サンプル, Google, Baidu, Facebook, Taobao)
site1.:::(site2) : List(Facebook, Taobao, サンプル, Google, Baidu)
List.concat(site1, site2) : List(サンプル, Google, Baidu, Facebook, Taobao)

List.fill()

List.fill() メソッドを使用して、指定した数の繰り返し要素を持つリストを作成できます:

実例

object Test {
   def main(args: Array[String]) {
      val site = List.fill(3)("サンプル") // サンプル を3回繰り返す
      println( "site : " + site  )

      val num = List.fill(10)(2)         // 要素 2 を10回繰り返す
      println( "num : " + num  )
   }
}

上記のコードを実行すると、出力結果は次のとおりです。

$ vim Test.scala 
$ scala Test.scala 
site : List(サンプル, サンプル, サンプル)
num : List(2, 2, 2, 2, 2, 2, 2, 2, 2, 2)

List.tabulate()

List.tabulate() メソッドは、指定された関数によってリストを作成します。

このメソッドの最初のパラメータは要素の数で、2次元にすることもできます。2番目のパラメータは指定された関数で、指定された関数の計算結果を返り値としてリストに挿入します。開始値は0です。例は次のとおりです。

実例

object Test {
   def main(args: Array[String]) {
      // 指定された関数で5つの要素を作成
      val squares = List.tabulate(6)(n => n * n)
      println( "1次元 : " + squares  )

      // 2次元リストを作成
      val mul = List.tabulate( 4,5 )( _ * _ )      
      println( "多次元 : " + mul  )
   }
}

上記のコードを実行すると、出力結果は次のとおりです。

$ vim Test.scala 
$ scala Test.scala 
一维 : List(0, 1, 4, 9, 16, 25)
多维 : List(List(0, 0, 0, 0, 0), List(0, 1, 2, 3, 4), List(0, 2, 4, 6, 8), List(0, 3, 6, 9, 12))

List.reverse

List.reverse はリストの順序を反転させるために使用されます。例は次のとおりです。

実例

object Test {
   def main(args: Array[String]) {
      val site = "サンプル" :: ("Google" :: ("Baidu" :: Nil))
      println( "site 反転前 : " + site )

      println( "site 反転後 : " + site.reverse )
   }
}

上記のコードを実行すると、出力結果は次のとおりです。

$ vim Test.scala 
$ scala Test.scala 
site 反转前 : List(サンプル, Google, Baidu)
site 反转后 : List(Baidu, Google, サンプル)

Scala List のよく使うメソッド

次の表は、Scala List でよく使われるメソッドの一覧です。

番号 メソッドと説明
1

def +:(elem: A): List[A]

リストの先頭に要素を追加します

scala> val x = List(1)
x: List[Int] = List(1)

scala> val y = 2 +: x
y: List[Int] = List(2, 1)

scala> println(x)
List(1)
2

def ::(x: A): List[A]

リストの先頭に要素を追加します

3

def :::(prefix: List[A]): List[A]

リストの先頭に指定されたリストの要素を追加します

4

def :+(elem: A): List[A]

要素を追加した後のリストをコピーします。

scala> val a = List(1)
a: List[Int] = List(1)

scala> val b = a :+ 2
b: List[Int] = List(1, 2)

scala> println(a)
List(1)
5

def addString(b: StringBuilder): StringBuilder

リストのすべての要素を StringBuilder に追加します

6

def addString(b: StringBuilder, sep: String): StringBuilder

リストのすべての要素を StringBuilder に追加し、区切り文字を指定します

7

def apply(n: Int): A

リストのインデックスで要素を取得します

8

def contains(elem: Any): Boolean

リストに指定された要素が含まれているかどうかを確認します

9

def copyToArray(xs: Array[A], start: Int, len: Int): Unit

リストの要素を配列にコピーします。

10

def distinct: List[A]

リストの重複要素を除去し、新しいリストを返します

11

def drop(n: Int): List[A]

最初のn個の要素を破棄し、新しいリストを返します

12

def dropRight(n: Int): List[A]

最後のn個の要素を破棄し、新しいリストを返します

13

def dropWhile(p: (A) => Boolean): List[A]

左から右へ、条件pが成立しなくなるまで要素を破棄します

14

def endsWith[B](that: Seq[B]): Boolean

リストが指定されたシーケンスで終わっているかどうかを確認します

15

def equals(that: Any): Boolean

等しいかどうかを判断します

16

def exists(p: (A) => Boolean): Boolean

リスト内に指定された条件を満たす要素が存在するかどうかを判断します。

l に何らかの要素が存在するかどうかを判断します:

scala> l.exists(s => s == "Hah")
res7: Boolean = true
17

def filter(p: (A) => Boolean): List[A]

指定された条件を満たすすべての要素を出力します。

長さが3の要素をフィルタリングします:

scala> l.filter(s => s.length == 3)
res8: List[String] = List(Hah, WOW)
18

def forall(p: (A) => Boolean): Boolean

すべての要素をチェックします。

例:すべての要素が「H」で始まるかどうかを判断します:

scala> l.forall(s => s.startsWith("H")) res10: Boolean = false
19

def foreach(f: (A) => Unit): Unit

リストのすべての要素に関数を適用します

20

def head: A

リストの最初の要素を取得します

21

def indexOf(elem: A, from: Int): Int

指定された位置 from から要素が最初に現れる位置を検索します

22

def init: List[A]

最後の要素を除くすべての要素を返します

23

def intersect(that: Seq[A]): List[A]

複数のコレクションの共通部分を計算します

24

def isEmpty: Boolean

リストが空かどうかを確認します

25

def iterator: Iterator[A]

要素を反復処理する新しいイテレータを作成します

26

def last: A

最後の要素を返します

27

def lastIndexOf(elem: A, end: Int): Int

指定された位置 end から要素が最後に現れる位置を検索します

28

def length: Int

リストの長さを返します

29

def map[B](f: (A) => B): List[B]

指定されたメソッドによってすべての要素を再計算します

30

def max: A

最大の要素を検索します

31

def min: A

最小の要素を検索します

32

def mkString: String

リストのすべての要素を文字列として表示します

33

def mkString(sep: String): String

区切り文字を使用して、リストのすべての要素を文字列として表示します

34

def reverse: List[A]

リストを反転します

35

def sorted[B >: A]: List[A]

リストをソートします

36

def startsWith[B](that: Seq[B], offset: Int): Boolean

リストが指定された位置に指定されたシーケンスを含むかどうかを確認します

37

def sum: A

コレクションの要素の合計を計算します

38

def tail: List[A]

最初の要素を除くすべての要素を返します

39

def take(n: Int): List[A]

リストの最初のn個の要素を抽出します

40

def takeRight(n: Int): List[A]

リストの最後のn個の要素を抽出します

41

def toArray: Array[A]

リストを配列に変換します

42

def toBuffer[B >: A]: Buffer[B]

リストのすべての要素を含むバッファを返します

43

def toMap[T, U]: Map[T, U]

List を Map に変換する

44

def toSeq: Seq[A]

List を Seq に変換する

45

def toSet[B >: A]: Set[B]

List を Set に変換する

46

def toString(): String

リストを文字列に変換します

その他のメソッドについては、次を参照できます:APIドキュメント

Scala 集合Scala コレクション

その他の拡張