[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
まとめ
解説は以上になります。
不明な点や気づいた点は、右下のチャットボタンからぜひご報告くださいね。
ご連絡をお待ちしております。