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
基本的な操作は書きましたが、さらにこんなことできるのかな?というときは上のリンクページを参考にしてみた方が良さそうです。
- 作者: Martin Odersky,Lex Spoon,Bill Venners,羽生田栄一,水島宏太,長尾高弘
- 出版社/メーカー: インプレスジャパン
- 発売日: 2011/09/27
- メディア: 単行本(ソフトカバー)
- 購入: 12人 クリック: 235回
- この商品を含むブログ (45件) を見る
- 作者: 中村修太
- 出版社/メーカー: 中村 修太
- 発売日: 2013/03/02
- メディア: Kindle版
- 購入: 1人 クリック: 27回
- この商品を含むブログ (4件) を見る