キーまたは値がマップに存在するかどうかを確認するにはどうすればよいですか?


87

私はscalaMapを持っていて、特定の値がマップに存在するかどうかをテストしたいと思います。

myMap.exists( /*What should go here*/ )

回答:


141

意味に応じて、いくつかの異なるオプションがあります。

「値」のキーと値のペアを意味する場合は、次のようなものを使用できます。

myMap.exists(_ == ("fish",3))
myMap.exists(_ == "fish" -> 3)

キーと値のペアの値を意味する場合は、次のことができます。

myMap.values.exists(_ == 3)
myMap.exists(_._2 == 3)

キーと値のペアのキーだけをテストしたい場合は、

myMap.keySet.exists(_ == "fish")
myMap.exists(_._1 == "fish")
myMap.contains("fish")

タプルフォーム(例_._1 == "fish")は最終的に短くなりますが、少し長いフォームは、何をしたいのかをより明確にすることに注意してください。


13
また、キーの存在をテストするために、ライブラリはmyMap.contains( "fish")を提供します
Dave Griffith

2
@ DaveGriffith-確かに。私は「存在する」を使用していましたが、それは追加するのに十分重要です(使用する必要があるため)。それに応じて回答を修正しました。
レックスカー2012年

25

がマップに存在するのか、それともキーに存在するのかを知りたいですか?キーを確認したい場合は、以下を使用してくださいisDefinedAt

myMap isDefinedAt key

9

マップ値の1つが合格するテストを提供します。

val mymap = Map(9->"lolo", 7->"lala")
mymap.exists(_._1 == 7) //true
mymap.exists(x => x._1 == 7 && x._2 == "lolo") //false
mymap.exists(x => x._1 == 7 && x._2 == "lala") //true

ScalaDocsは、「この不変マップの要素のいくつかに対して述語が成り立つかどうかをテストする」メソッドについて述べています。キャッチは、2つのパラメーターの代わりにタプル(キー、値)を受け取ることです。


6

これはどうですか:

val map = Map(1 -> 'a', 2 -> 'b', 4 -> 'd')
map.values.toSeq.contains('c')  //false

利回りtrueマップが含まれている場合はc値を。

あなたが使用することを主張する場合exists

map.exists({case(_, value) => value == 'c'})

2
values新しいIterableものを作成するので、おそらくあなたのほうが良いでしょうmap.valuesIterator.contains('c')(それはそれほど簡単ではありませんがmap.exists(_._2 == 'c')!)
Luigi Plinge 2012年

3

上記の回答によると、exists()はcontains()よりも大幅に遅いことに注意してください(5000個の文字列キーを含むマップでベンチマークを行い、比率は一貫してx100でした)。私はscalaに比較的慣れていませんが、exists()はすべてのキー(またはkey、value tupple)を反復処理しているのに対し、containsはMapのランダムアクセスを使用していると思います

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.