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

Scala List(リスト)

Scala 集合

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

リストの要素の型 T は List[T] で書くことができます。例えば、以下に様々なタイプのリストが示されています:

// 文字リスト
val site: List[String] = List("w3codebox", "Google", "Baidu")
// 整数リスト
val nums: List[Int] = List(1, 2, 3, 4)
// 空リスト
val empty: List[Nothing] = List()
// 二次元リスト
val dim: List[List[Int]] =
   List(
      List(1, 0, 0),
      List(0, 1, 0),
      List(0, 0, 1)
   )

リストを構成する基本単位は Nil および ::

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

上記の例は以下のように書くこともできます:

// 文字リスト
val site = "w3codebox" :: ("Google" :: ("Baidu" :: Nil))
// 整数リスト
val nums = 1 :: (2 :: (3 :: (4 :: Nil)))
// 空リスト
val empty = Nil
// 二次元リスト
val dim = (1 :: (0 :: (0 :: Nil))) ::
          (0 :: (1 :: (0 :: Nil))) ::
          (0 :: (0 :: (1 :: Nil))) :: Nil

リスト基本操作

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

  • head リストの最初の要素を返します

  • tail 最初の要素以外の要素を含むリストを返します

  • isEmpty リストが空の場合に true を返します

Scalaリストの操作はこれらの基本操作で表現できます。以下に例を示します:

// 文字リスト
object Test {
   def main(args: Array[String]) {
      val site = "w3codebox" :: ("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 
第一网站是 : w3重複 w
最后一个网站是 : List(Google, Baidu)
查看列表 site 是否为空 : false
查看 nums 是否为空 : true

连接列表

你可以使用 :: 演算子或 List.:::() 方法或 List.concat() 方法来连接两个或多个列表。示例如下:

object Test {
   def main(args: Array[String]) {
      val site1 = "w3codebox" :: ("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(site1List.concat(site2)
      println( "List.concat(site1List.concat(site2): " + fruit  )
      
   }
}

上記のコードを実行すると、出力結果は以下の通りです:

$ vim Test.scala 
$ scala Test.scala 
site1 ::: site2 : List(w3) : List(w
site1.:::(site2): List(Facebook, Taobao, w3codebox、Google、Baidu)
List.concat(site1List.concat(site2, site3) : List(w

codebox、Google、Baidu、Facebook、Taobao)

List.fill()

object Test {
   def main(args: Array[String]) {
      List.fill() メソッドを使用して指定された数の重複要素を持つリストを作成できます:3val site = List.fill(3)("w // codebox)3重複 w 3重複要素
      codebox + println( "site : "
      site  )10val num = List.fill(2)         // )( 2, 10 重複要素
      回 + println( "num : "
   }
}

上記のコードを実行すると、出力結果は以下の通りです:

$ vim Test.scala 
$ scala Test.scala 
num  )3site : List(w3site : List(w3codebox)
codebox、w2, 2, 2, 2, 2, 2, 2, 2, 2, 2)

num : List(

List.tabulate()

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

object Test {
   def main(args: Array[String]) {
      // 指定された関数を使用してリストを作成します。 5 要素
      val squares = List.tabulate(6)(n => n * n)
      println( "一次元 : " + squares  )
      // 二重リストの作成
      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 = "w3codebox" :: ("Google" :: ("Baidu" :: Nil))
      println( "site 反転前 : " + site )
      println( "site 反転後 : " + site.reverse )
   }
}

上記のコードを実行すると、出力結果は以下の通りです:

$ vim Test.scala 
$ scala Test.scala 
site 反転前 : List(w3codebox、Google、Baidu)
site 逆転後 : List(Baidu, Google, w3codebox)

Scala Listの一般的なメソッド

以下は、Scala Listの一般的なメソッドの一覧です:

番号メソッド及び説明
1

: +: (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]

指定された要素のリストを返します

12

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

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

13

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

from: Int)

14

条件pが成立しないまで左から要素を削除する

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]

リストを Map に変換

44

def toSeq: Seq[A]

リストを Seq に変換

45

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

リストを Set に変換

46

def toString(): String

リストを文字列に変換

さらに多くのメソッドについては参照してください API 文書

Scala 集合