Skip to content

Instantly share code, notes, and snippets.

@nenono
Created March 17, 2015 06:49
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save nenono/be2ae30a80dfdae7656c to your computer and use it in GitHub Desktop.
Save nenono/be2ae30a80dfdae7656c to your computer and use it in GitHub Desktop.
Scalaのコレクション
// 主要なコレクションクラスの確認と、各種の糖衣構文
object Collections {
// cons cell list
def listTest = {
println("--listTest--")
// create
val list = List("a", "b", "c", "d", "e")
// ↑["a", "b", "c", "d", "e"]
// 対象オブジェクト(引数リスト)の記法は、applyメソッドの糖衣構文です。
// 型名(引数リスト)の記法になっているのは、Listクラスに同名のシングルトンオブジェクト(コンパニオンオブジェクト)が定義されていて
// そちらのメソッドを呼び出しているためです。この場合List.apply("a", "b", "c", "d", "e")と等価。
// size
val size = list.size
println(s"size:${size}")
// cons
val list2 = "z"::list
println(s"list2:${list2}") // ["z", "a", "b", "c", "d", "e"]
val list3 = 1::2::3::Nil
println(s"list3:${list3}") // [1, 2, 3]
// 要素の型が違う場合
val unsafe = 1::"a"::Nil
println(s"unsafe:${unsafe}") // [1, "a"] ... List[Any]型になります(共通の親クラスの型を推論する)
// get
val third = list(2) // インスタンスに対するapplyメソッドの糖衣構文が要素取得になっていて、つまりlist.apply(2)と等価。
println(s"3->${third}") // "c"
// pattern match
val x::y::zs = list // 変数初期化時のパターンマッチもできます。この場面では当然ながらlistの要素が足りなければエラーになります。
println(s"x:${x}, y:${y}, zs:${zs}") // x:"a", y:"b", zs:["c", "d", "e"]
// head, tail
println(s"head:${list.head}, tail:${list.tail}") // head:"a", tail:["b", "c", "d", "e"]
}
// array(mutable)
def arrayTest = {
println("--arrayTest--")
// create
val arr = Array("a", "b", "c", "d", "e")
// size
val size = arr.size
println(s"size:${size}")
// get
println(s"first:${arr(0)}, second:${arr(1)}")
// update
arr(0) = "z" // 対象オブジェクト(引数1) = 引数2 の記法は、updateメソッドの糖衣構文で、この場合 arr.update(0, "z")と同じです。
println(s"result:${arr}") // ["z", "b", "c", "d", "e"]
}
// vector(immutable)
def vectorTest = {
// arrayのようにランダムアクセスが多いが、listのようにimmutableであってほしい場合はvectorを使います
// 参考: [Collections - 具象不変コレクションクラス - Scala Documentation](http://docs.scala-lang.org/ja/overviews/collections/concrete-immutable-collection-classes.html)
println("--vectorTest--")
// create
val vec = Vector("a", "b", "c", "d", "e")
// size
val size = vec.size
println(s"size:${size}")
// get
println(s"first:${vec(0)}, second:${vec(1)}")
// update
val vec2 = vec.updated(0, "z") // 要素の値が更新された新しいvectorインスタンスを生成します
println(s"result:${vec2}") // ["z", "b", "c", "d", "e"]
}
// map(immutable)
def mapTest = {
println("--mapTest--")
// create
val map = Map("a"->1, "b"->2, "c"->3)
// この -> は、2要素Tuple生成を行うファクトリメソッド呼び出しに変換されます
// 単に2引数メソッドは . や括弧が省略できるという糖衣構文なので、この場合 "a"->1 は "a".->(1) になります
// size
val size = map.size
println(s"size:${size}")
// get
val elementOfA = map("a")
println(s"a->${elementOfA}")
// add
val map2 = map + ("d"->4)
// 二項演算子 + がメソッドとして定義されていて、map.+("d".->(4)) と同じです。
// immutableなデータ構造なので、要素を追加した結果の新しいインスタンスが返されます。
println(s"d->${map2("d")}")
// remove
val map3 = map2 - "a"
// 同じく二項演算子 - が定義されています。右辺にはキー値を渡します。
// immutableなので、要素を削除した結果の新しいインスタンスが返されます。
println(s"result:${map3}")
}
// set(immutable) = 集合
def setTest = {
println("--setTest--")
// create
val set = Set("a", "b", "c")
// size
val size = set.size
println(s"size:${size}")
// contains?
val containsB = set("b") // set.apply("b")と同じ
println(s"contains b?:${containsB}")// true
// add
val set2 = set + "d"
println(s"result:${set2}")
// remove
val set3 = set2 - "a"
println(s"result:${set3}")
}
def main(args: Array[String]) {
listTest
arrayTest
vectorTest
mapTest
setTest
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment