Scalaのコレクション(Seq, Set, Map)とタプル

参考サイト
Scalaコレクションメモ(Hishidama's Scala collection Memo)

全体像

  • Seq (シーケンス)
    • List (リスト)
    • Array (配列)
    • Range (レンジ)
    • String (文字列)
  • Set (集合)
  • Map (連想配列)

Seqは、いわゆる基本的な配列。
Setは、要素の重複を許さない集合。
Mapは、キーと値のペアを持つ連想配列。

List

Listは不変な配列です。

scala> List(1, 2, 3)
res0: List[Int] = List(1, 2, 3)

Seqを作成するとListが作成されます。

scala> Seq(1, 2, 3)
res1: Seq[Int] = List(1, 2, 3)

不変なので要素の変更はできません。

scala> res1(0) = 9
error: value update is not a member of Seq[Int]

コンス(::)とNil

コンス(::)はリストを連結する演算子です。
Nilは空のリストを表すオブジェクトです。

scala> 1::2::3::Nil
res2: List[Int] = List(1, 2, 3)

scala> 0::res2
res3: List[Int] = List(0, 1, 2, 3)

Array

Arrayは可変な配列です。

scala> Array(1, 2, 3)
res0: Array[Int] = Array(1, 2, 3)

scala> res0(0) = 9

scala> res0
res2: Array[Int] = Array(9, 2, 3)

Range

Rangeは範囲を表します。

scala> 1 to 3
res0: scala.collection.immutable.Range.Inclusive = Range 1 to 3

scala> (1 to 3).toList
res1: List[Int] = List(1, 2, 3)

String

文字列も配列のように扱えます。
「暗黙の型変換」によりStringOps型に変換されることと、StringOpsが継承しているStringLikeによって配列のように扱えます。

scala> val str = "ABCDE"
str: String = ABCDE

scala> str.map(c => c.toLower)
res0: String = abcde

scala> str.filter(c => c != 'B')
res1: String = ACDE

scala> str(0)
res2: Char = A

Set

Setは集合を表します。値が存在しているかどうかを保持するのに適しています。
要素は重複しません。Listと違って、並び順は保持しません。

参考サイト
第12章:ScalaのSetリファレンス - Qiita

scala> val s = Set(1,2,2,3,3)
s: scala.collection.immutable.Set[Int] = Set(1, 2, 3)

scala> s(0)
res0: Boolean = false

scala> s(1)
res1: Boolean = true

scala> s.contains(2)
res2: Boolean = true

(x)やcontains(x)で値が存在するか確かめることができます。
また集合同士で演算することも可能です。以下は積集合を求めています。

scala> val s1 = Set(1, 2, 3)
s1: scala.collection.immutable.Set[Int] = Set(1, 2, 3)

scala> val s2 = Set(3, 4, 5)
s2: scala.collection.immutable.Set[Int] = Set(3, 4, 5)

scala> s1 & s2
res0: scala.collection.immutable.Set[Int] = Set(3)

ちなみに順序を保持するTreeSetというコレクションもあります。

Map

Mapはキーと値のペアを持つ連想配列です。
Setと同じく並び順は保持しません。(保持できるTreeMapがあるのも同じ)

scala> val m = Map("color" -> "red", "number" -> 3)
m: scala.collection.immutable.Map[String,Any] = Map(color -> red, number -> 3)

scala> m.get("color")
res0: Option[Any] = Some(red)

scala> m.toList
res1: List[(String, Any)] = List((color,red), (number,3))

scala> m.toMap
res2: scala.collection.immutable.Map[String,Any] = Map(color -> red, number -> 3)

タプル

参考サイト
Scalaタプルメモ(Hishidama's Scala Tuple Memo)

タプルとは複数の値を1つのかたまりとして扱うものです。タプルは変更できません。
タプルはリテラルであり、コレクションではありません。(←合ってる?)
(x, y, z)で3要素のタプルです。またx -> yで2要素のタプルを表すことができます。

val t1 = (1, 2, 3)
val t2 = "foo" -> 0 // ("foo", 0)と同じ

コレクションのMapはキーと値をタプルで持っています。

scala> val m1 = Map(t2)
m1: scala.collection.immutable.Map[String,Int] = Map(foo -> 0)

// Mapにすることで、もちろんMapのメソッドを使えます。
scala> m1.toList
res0: List[(String, Int)] = List((foo,0))

// タプルでは使えません
scala> t2.toList
<console>:13: error: value toList is not a member of (String, Int)