web-dev-qa-db-ja.com

キーまたは値がマップに存在するかどうかを確認する方法は?

scalaマップがあり、マップに特定の値が存在するかどうかをテストしたいと思います。

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

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

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

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")は短くなりますが、わずかに長いフォームは、何が起きたいかをより明確にすることに注意してください。

127
Rex Kerr

valueがマップに存在するのか、キーに存在するのか知りたいですか?キーを確認する場合は、isDefinedAtを使用します。

myMap isDefinedAt key
19

マップ値の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つのパラメーターの代わりにTuple(キー、値)を受け取るということです。

9
ilcavero

これはどうですか:

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

マップにtrue値が含まれる場合、cを生成します。

existsの使用を主張する場合:

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

上記の回答によると、exists()はcontains()よりもかなり遅いことに注意してください(5000個の文字列キーを含むマップでベンチマークを行い、比率は一貫したx100でした)。私はscalaに比較的新しいですが、私の推測はexists()がMapのランダムアクセスを使用するのに対し、すべてのキー(またはキー、値のタプル)を反復していることです

2
rpeleg