English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية
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
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)
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 はリストの順序を反転させるために使用されます。以下はその例です:
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の一般的なメソッドの一覧です:
番号 | メソッド及び説明 |
---|---|
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 文書