[AD] Scalaアプリケーションの開発・保守は合同会社ミルクソフトにお任せください
ScalaのMap
に特定のキーや値があるかどうかを調べる方法についてご紹介します。
概要
特定のキーの有無を調べるにはcontains
メソッド、値や要素の有無を調べるにはexists
メソッドを使用します。
以下のMapクラスのインスタンスについて早速見ていきましょう。
val map: Map[Int, String] = Map( 1 -> "apple", 2 -> "orange", 3 -> "grape", 4 -> "strawberry", )
contains
メソッドの使い方
マップに特定のキーが存在するかどうかを調べたい場合は、contains
メソッドを使用します。
println( map.contains(3) ) println( map.contains(5) )
出力は以下のようになります。
存在する場合はtrue
、存在しない場合はfalse
が返ります。
true false
exists
メソッドの使い方
マップに特定の値が存在するかどうかを調べたい場合、
あるいはキーと値の両方について調べたい場合はexists
メソッドを使用します。
(もちろん、キーの存在を確認する場合についても使えます)。
println( map.exists { case (_, v) => v == "orange" } )
出力は以下のようになります。
存在する場合はtrue
、存在しない場合はfalse
が返ります。
true
特定の組み合わせが存在することを確認したい場合はこのようにします。
println( map.exists(_ == (3, "grape")) )
出力は以下のようになります。
期待通りの値が返ってきていることを確認してください。
true
scala.collection.Map
にはjava.util.Map#containsValue
に相当するメソッドはありません。
そのかわりにexists
を使って確認するようにしてください。
値がある場合に取得するには
キーに対応する値があれば取得したい、という場合にはget
を使いましょう。
map.get(3) .foreach(println)
出力は以下のようになります。
grape
他にもapply
メソッド、find
メソッドなどがあるので、お好みで使い分けてください。
存在しないかどうかを調べたい
特定のキーや値が存在"しない"ことを調べるメソッドはありません。
したがって、結果として返ってくるBoolean
を!
演算子で逆転させましょう。
特定のキーの有無について次のようにします。
println( !map.contains(3) )
出力は以下のようになります。
false
特定の値や要素の有無について次のようにします。
println( !map.exists { case (_, v) => v == "orange" } )
出力は以下のようになります。
false
正規表現で調べる
特定のパターンにあてはまるキーや値が存在することを調べるには、
exists
メソッドの中で正規表現を使いましょう。
val numberRegex: Regex = "[0-9]".r println( map.exists { case (_, v) => numberRegex.findFirstIn(v).nonEmpty } )
出力は以下のようになります。
false
指定したキー/値/要素を全部含んでいるかどうか調べたい
指定したキー、値、要素をマップが全部含んでいるかどうかを調べたい場合は、forall
メソッドと組み合わせましょう。
以下ようなマップを追加で定義します。
これに含まれるキーや値や要素がmap
インスタンスにすべて含まれるかどうか確かめてみましょう。
val subMap: Map[Int, String] = Map( 2 -> "orange", 3 -> "grape", )
キーが全部含まれるかどうか調べる
forall
メソッドの中でcontains
メソッドを使えばOKです。
println( subMap.forall { case (k, _) => map.contains(k) } )
出力は以下のようになります。
true
値が全部含まれるかどうか調べる
forall
メソッドの中でexists
メソッドを使えばOKです。
println( subMap.forall { case (_, v) => map.exists { case (_, sv) => v == sv } } )
出力は以下のようになります。
true
要素が全部含まれるかどうか調べる
こちらも、forall
メソッドの中でexists
メソッドを使います。
タプルをタプルとして比較すればOKです。
println( subMap.forall(e => map.exists(_ == e)) )
出力は以下のようになります。
true
まとめ
解説は以上になります。
不明な点や気づいた点は、右下のチャットボタンからぜひご報告くださいね。
ご連絡をお待ちしております。