containsやexistsの使い方は?Mapにキーや値、要素が含まれるか調べる方法

Scala 3 (Dotty 0.26.0-RC1) 2.13.3 2.12.12
最終更新:2020年5月19日

[AD] scalapediaでは記事作成ボランティアを募集しています

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

まとめ

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

サイト内検索