【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)
学んだことを駆使してちっぽけでも何かを作ったりするのは大事だと思いました