Scala List(リスト)
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つ以上のリストを連結できます。例は次のとおりです。
実例
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() メソッドを使用して、指定した数の繰り返し要素を持つリストを作成できます:
実例
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です。例は次のとおりです。実例
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 はリストの順序を反転させるために使用されます。例は次のとおりです。
実例
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 コレクション