ScalaのMapコレクションについて

今回もScalaの代表的なコレクションMapについて調べたのでブログに書いておきます。

Mapはデフォルトがimmutableで、mutablle.Mapを使うことでmutableなMapを作成することも可能。

mutableなMap

scala> import scala.collection.mutable.Map
import scala.collection.mutable.Map

scala> val treasureMap = Map[ Int, String ]()
treasureMap: scala.collection.mutable.Map[Int,String] = Map()

scala> treasureMap += (1 -> "Go to island.")
res1: treasureMap.type = Map(1 -> Go to island.)

scala> treasureMap += (2 -> "Find big X on ground.")
res2: treasureMap.type = Map(2 -> Find big X on ground., 1 -> Go to island.)

指定したkeyと値を持つMapを作成する場合は↓のようにしたらOKです。

scala> val phone = Map(1 -> "iPhone", 2 -> "Galaxy")
phone: scala.collection.immutable.Map[Int,String] = Map(1 -> iPhone, 2 -> Galaxy)

scala> phone
res0: scala.collection.immutable.Map[Int,String] = Map(1 -> iPhone, 2 -> Galaxy)

ちなみにMapを作成したときにでてきた -> はタプルを生成するためのメソッドで、Mapの要素はkeyとvalueのタプルです。


値を取得するために以下のメソッドを使うことも可能です。
・get
・getOrElse
・apply

//Option型で取得する
scala> phone.get(2)
res1: Option[String] = Some(Galaxy)

//存在しないキーをしていするとNoneを返す
scala> phone.get(0)
res2: Option[String] = None

//keyがない場合の初期値を指定して値を取得する
scala> phone.getOrElse(3, "None")
res3: String = None

//値を取得する
scala> phone.apply(1)
res1: String = iPhone

//存在しないキーを指定するとこのようにNoSuchElementExceptionを返す
scala> phone.apply(5)
java.util.NoSuchElementException: key not found: 5
  at scala.collection.MapLike$class.default(MapLike.scala:228)
  at scala.collection.AbstractMap.default(Map.scala:59)
  at scala.collection.MapLike$class.apply(MapLike.scala:141)
  at scala.collection.AbstractMap.apply(Map.scala:59)
  ... 32 elided

ちなみにphone.apply(1)とphone(1)は同じ意味で、applyは省略可能です。

Mapの繰り返し処理

scala> val phone = Map( 1 -> "iPhone", 2 -> "Galaxy", 3 -> "Xperia")
phone: scala.collection.immutable.Map[Int,String] = Map(1 -> iPhone, 2 -> Galaxy, 3 -> Xperia)

scala> phone.foreach { case (key, value) => println(key + ":" + value) }
1:iPhone
2:Galaxy
3:Xperia
//valueを繰り返し処理することも可能です
scala> phone.values.foreach { value => println("name is " + value) }
name is iPhone
name is Galaxy
name is Xperia

ここより下で説明している要素の追加や要素の削除は、phoneのMapの構造を直接変更しているわけではありません。
新たなMapを作成してその要素に何かしらの変更を加えています。

Mapに要素を追加する

scala> val phone2 = phone + (4 -> "Nexus")
phone2: scala.collection.immutable.Map[Int,String] = Map(1 -> iPhone, 2 -> Galaxy, 3 -> Xperia, 4 -> Nexus)

Mapの要素を削除する

scala> val phone3 = phone - 3
phone3: scala.collection.immutable.Map[Int,String] = Map(1 -> iPhone, 2 -> Galaxy)

その他にもMapで使えるメソッドは↓にあります。
http://www.scala-lang.org/api/2.11.2/#scala.collection.Map


基本的な操作は書きましたが、さらにこんなことできるのかな?というときは上のリンクページを参考にしてみた方が良さそうです。

Scalaスケーラブルプログラミング第2版

Scalaスケーラブルプログラミング第2版

Guide to ScalaーScalaプログラミング入門

Guide to ScalaーScalaプログラミング入門