Created
March 17, 2015 06:49
-
-
Save nenono/be2ae30a80dfdae7656c to your computer and use it in GitHub Desktop.
Scalaのコレクション
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
// 主要なコレクションクラスの確認と、各種の糖衣構文 | |
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