第11章：ScalaのSeqリファレンス

今回はSeqについて、リファレンスなノリで紹介するよ。

入門編としてこちらも読んでね(^^)v
[ 第8章：Scalaのコレクション(Seq, Set, Map)入門](http://qiita.com/f81@github/items/dc79819d23ce4889d552)

# scala.collection.immutable.Seq
要素の順序を意識する必要がある場合に、使う箱だ。
JavaのListと役割は似ているね。
ただ色んなことができるんだ。
しかも前回の[ 第10章：ScalaのTraversableリファレンス](http://qiita.com/f81@github/items/62ad3c56ce6be271ef35)で紹介したメソッドも使えるんだ。
前回のソースのほとんどがSeqだったことに気付いたかな？

## 添字参照
### (i)
添字の要素を返す

```scala
scala> Seq(1, 2, 3)(2)
res0: Int = 3
```

### isDefinedAt
指定した値が、添字の範囲に存在するか判定する

```scala
scala> Seq(1, 2, 3) isDefinedAt (3)
res1: Boolean = false

scala> Seq(1, 2, 3) isDefinedAt (2)
res2: Boolean = true
```

## 長さ
### length
要素の数を返す

```scala
scala> Seq(1, 2, 3) length
res3: Int = 3
```

### lengthCompare
要素数が指定した値と比較し以下を返す
- 少ない場合は1
- 同じ場合は0
- 多い場合は1

```scala
scala> Seq(1, 2, 3) lengthCompare (2)
res4: Int = 1

scala> Seq(1, 2, 3) lengthCompare(3)
res5: Int = 0

scala> Seq(1, 2, 3) lengthCompare (4)
res6: Int = -1
```

### indices
添字の範囲を返す

```scala
scala> Seq(1, 2, 3) indices
res7: scala.collection.immutable.Range = Range(0, 1, 2)
```

## 検索
### indexOf
指定した値と等しい最初の要素の添字を返す

```scala
scala> Seq(1, 2, 3, 2) indexOf (2)
res8: Int = 1

scala> Seq(1, 2, 3, 2) indexOf (4)
res9: Int = -1
```

### lastIndexOf
指定した値と等しい最後の要素の添字を返す

```scala
scala> Seq(1, 2, 3, 2) lastIndexOf (2)
res10: Int = 3
```

### indexOfSlince
指定したシーケンスと等しい最初の要素の添字を返す

```scala
scala> Seq(1, 2, 3, 2, 3) indexOfSlice Seq(2, 3)
res11: Int = 1

scala> Seq(1, 2, 3, 2, 3) indexOfSlice Seq(2, 2)
res12: Int = -1
```
### lastIndexOfSlice
指定したシーケンスと等しい最後の要素の添字を返す

```scala
scala> Seq(1, 2, 3, 2, 3) lastIndexOfSlice Seq(2, 3)
res13: Int = 3
```
### indexWhere
関数を満たす最初の要素の添字を返す

```scala
scala> Seq(1, 2, 3, 2, 3) indexWhere (_ == 2)
res14: Int = 1
```

### prefixLength
関数を満たさない最初の要素の添字を返す

```scala
scala> Seq(1, 2, 3, 2) prefixLength (_ != 3)
res15: Int = 2
```

## 加算・追加
### +:
指定した要素をSeqの先頭に追加した新しいSeqを返す

```scala
scala> 4 +: Seq(1, 2, 3)
res16: Seq[Int] = List(4, 1, 2, 3)
```
### :+
指定した要素をSeqの末尾に追加した新しいSeqを返す

```scala
scala> Seq(1, 2, 3) :+ 4
res17: Seq[Int] = List(1, 2, 3, 4)
```

### padTo
指定した長さになるまで、指定した要素をパディングする

```scala
scala> Seq(1, 2, 3) padTo (10, 4)
res18: Seq[Int] = List(1, 2, 3, 4, 4, 4, 4, 4, 4, 4)
```
## 更新
### patch
指定した添字から指定した要素数を、指定したSeqで置き換えた新しいSeqを返す

```scala
scala> Seq(1, 2, 3) patch (1, Seq(4, 5, 6), 2)
res19: Seq[Int] = List(1, 4, 5, 6)
```
### updated
指定した添字の要素を、指定した要素で置き換えた新しいSeqを返す

```scala
scala> Seq(1, 2, 3) updated (2, 4)
res20: Seq[Int] = List(1, 2, 4)
```

## ソート
### sorted
要素をソートした新しいSeqを返す

```scala
scala> Seq(4, 1, 5, 2, 3, 7, 8) sorted
res21: Seq[Int] = List(1, 2, 3, 4, 5, 7, 8)
```

## 逆順
### reverse
要素を逆順にした新しいSeqを返す

```scala
scala> Seq(1, 2, 3) reverse
res22: Seq[Int] = List(3, 2, 1)
```

## 比較
### startsWith
指定されたSeqで始まっているか判定する

```scala
scala> Seq(1, 2, 3) startsWith Seq(1, 2)
res23: Boolean = true

scala> Seq(1, 2, 3) startsWith Seq(2, 3)
res24: Boolean = false
```
### endsWith
指定されたSeqで終わっているか判定する

```scala
scala> Seq(1, 2, 3) endsWith Seq(2, 3)
res25: Boolean = true

scala> Seq(1, 2, 3) endsWith Seq(1, 2)
res26: Boolean = false
```

### contains
指定した要素を含んでいるか判定する

```scala
scala> Seq(1, 2, 3) contains (3)
res27: Boolean = true

scala> Seq(1, 2, 3) contains (4)
res28: Boolean = false
```

### containsSlice
指定したSeqを含んでいるか判定する

```scala
scala> Seq(1, 2, 3, 4, 5) containsSlice Seq(3, 4)
res29: Boolean = true

scala> Seq(1, 2, 3, 4, 5) containsSlice Seq(4, 4)
res30: Boolean = false
```

## 集合間演算
### intersect
積集合を返す

```scala
scala> Seq(1, 2, 3) intersect Seq(2, 3, 4, 5, 6)
res28: Seq[Int] = List(2, 3)
```

### diff
差集合を返す

```scala
scala> Seq(2, 3, 4, 5, 6) diff Seq(1, 2, 3)
res30: Seq[Int] = List(4, 5, 6)
```

### union
和集合を返す

```scala
scala> Seq(2, 3, 4, 5, 6) union Seq(1, 2, 3)
res31: Seq[Int] = List(2, 3, 4, 5, 6, 1, 2, 3)
```

### distinct
重複要素を取り除いた新しいSeqを返す

```scala
scala> Seq(2, 3, 4, 5, 6, 2, 3) distinct
res32: Seq[Int] = List(2, 3, 4, 5, 6)
```

# まとめ
今回は、 コレクションのSeqトレイトのメソッドについて語ってみたけどどうだった？
前回と同じで、やっぱりこの辺は体を動かさないとわからないね。
どのような場面で使うかを想像しながら、ソースを書いて動かしてみてね。

今回も
__体で感じてくれたかな？__