【Scala】リストの基本

こちらのページを使ってScalaのお勉強。

http://bach.istc.kobe-u.ac.jp/lect/ProLang/org/scala-list.html

今回はListの基本的なことについて(リンク先の2の部分)

 

Listの作成

List(a, b, c, ...) あるいはa :: b :: c ::  ...   ::Nil でListを作れる。

var リスト名 = List(....)でリストを定義できる。

配列(Array)との違いはよく分かってない僕

 

List[type]( )で型の指定も可能。

特に指定がないなら型推論によってInt型やDouble型、String型などになる。

数字と文字が混在するリストはAny型となる。

Any型 >>>細分化>>> Int型、String型など

 

Range

scala> Range(1,4) 

res: scala.collection.immutable.Range = Range(1, 2, 3)

1以上4未満の列が作れる。どうしてもリストに変換したい場合は最後に.toListでリスト化できる

 

scala> 1 to 4

res: scala.collection.immutable.Range.Inclusive = Range(1, 2, 3, 4)

こっちのほうが便利(1以上4以下になるけど)

 

scala> 1 until 4

res: scala.collection.immutable.Range = Range(1, 2, 3)

Rangeと同じ感覚で使いたいならこっち

 

scala> 1 to 9 by 3

res: scala.collection.immutable.Range = Range(1, 4, 7)

特定の間隔で列を作りたいとき。奇数列や偶数列も作れるね

 

基本的なメソッド

メソッドはいっぱいあるけど、とりあえず基本的なところだけ

下準備に変数listを作っておく

scala> var list = (1 to 5).toList

list: List[Int] = List(1, 2, 3, 4, 5)

 

head 先頭の要素を求める

scala> list.head

res: Int = 1

 

last 最後の要素を求める

scala> list.last

res: Int = 5

 

tail 先頭を除いたリストを求める

scala> list.tail

res108: List[Int] = List(2, 3, 4, 5)

 

init 最後を除いたリストを求める

scala> list.init

res109: List[Int] = List(1, 2, 3, 4)

 

length リストの長さを求める

scala> list.length

res: Int = 5

 

isEmpty 空リストかどうかの判定

scala> list.isEmpty

res: Boolean = false

 

apply(n) n番目の要素を求める

scala> list.apply(0)

res: Int = 1

list名(n)でも可。あれ、applyいらなくね。

scala> list(0)

res: Int = 1

 

take(n) 最初からn個の要素からなるリストを求める

scala> list.take(2)

res: List[Int] = List(1, 2)

 

takeRight(n) 最後のn個の要素からなるリストを求める

scala> list.takeRight(2)

res: List[Int] = List(4, 5)

 

drop(n) 最初のn個の要素を除いたリストを求める

scala> list.drop(2)

res: List[Int] = List(3, 4, 5)

 

dropRight(n) 最後のn個の要素を除いたうんぬんかんぬん

scala> list.dropRight(2)

res: List[Int] = List(1, 2, 3)

 

contains(x) xが要素に含まれているかどうかの判定

scala> list.contains(2)

res: Boolean = true

 

reverse 逆順にしたリストを求める

scala> list.reverse

res: List[Int] = List(5, 4, 3, 2, 1)

 

sorted 昇順にしたリストを略

scala> list.sorted

res: List[Int] = List(1, 2, 3, 4, 5)

降順にしたい場合はlist.sorted(Ordering[Int].reverse)

 

:: (+:でも可) 先頭に要素を追加したリストを~

scala> 3 +: list

res: List[Int] = List(3, 1, 2, 3, 4, 5)

 

:+ 最後に要素を追加した~

scala> list :+ 3

res: List[Int] = List(1, 2, 3, 4, 5, 3)

: はlistに近くなるように。

 

== リストの比較

scala> list == List(1,2,3,4,5)

res: Boolean = true

 

::: リストの連結

scala> list ::: list

res: List[Int] = List(1, 2, 3, 4, 5, 1, 2, 3, 4, 5)

 

sum 要素の和

scala> list.sum

res: Int = 15

 

product 要素の積

scala> list.product

res: Int = 120

 

max 最大値

scala> list.max

res: Int = 5

 

min 最小値

scala> list.min

res: Int = 1

 

基本だけでも多いからパッと名前が出てくるまで復習

組み合わせればlastを使わなくても最後の要素を求められたりもする。

というわけで色々組み合わせてみた

 

・2つのリストを連結して昇順に

scala> var lista = List(2, 5, 6) ; var listb = List(1, 3, 4)

lista: List[Int] = List(2, 5, 6)

listb: List[Int] = List(1, 3, 4)

scala> (lista ::: listb).sorted

res: List[Int] = List(1, 2, 3, 4, 5, 6)

 

・2番目に大きい数を求める

scala> var listc = List(3, 6, 8, 2, 1, 7)

listc: List[Int] = List(3, 6, 8, 2, 1, 7)

scala> listc.sorted(Ordering[Int].reverse)(1)

res: Int = 7

※2番目に小さい数を求めたいときにlistc.sorted(1)とやるとエラーになる。

sortedの直後の()内は降順のときのようにOrdering~のような形式?を扱うため。

ので、面倒だがlistc.sorted(Ordering[Int])(1)としよう。

もっとも他にやりようはあるのかもしれないけど

 

フィボナッチ数列を作る

 

var n = 0

fib = List(1,1)

 

while (n <= 10) {

  fib = fib :+ fib.takeRight(2).sum

  n += 1

}  

println(fib)

 

 

学んだことを駆使してちっぽけでも何かを作ったりするのは大事だと思いました