我正在尝试在给定值的Map中找到一个键。我正在使用'find'函数,因为它无法为它找出正确的谓词:
val colors = Map(1 -> "red", 2 -> "blue")
def keyForValue(map: Map[Int, String], value: String) = {
val bool = map.find{map.foreach{map.values(i) == value}}
bool.key
}
当我知道值时,如何迭代地图并找到密钥?
答案 0 :(得分:13)
您使用与List
相同类型的谓词,但要记住,您通过(key,value)
对评估它,而不仅仅是值 (还有一双回来!)。
简单示例:
val default = (-1,"")
val value = "red"
colors.find(_._2==value).getOrElse(default)._1
答案 1 :(得分:2)
find
中Map
的签名为find(p: ((A, B)) ⇒ Boolean): Option[(A, B)]
。因此谓词需要Tuple2
,并且必须返回Boolean
。注意我将value
更改为Int
,因为colors
中的密钥也是Int
。
scala> def keyForValue(map: Map[Int, String], value: Int) = {
| colors.find({case (a,b) => a == value})
| }
keyForValue: (map: Map[Int,String], value: Int)Option[(Int, String)]
测试:
scala> keyForValue(colors, 1)
res0: Option[(Int, String)] = Some((1,red))
您还可以使用get
:
scala> colors.get(1)
res1: Option[String] = Some(red)
答案 2 :(得分:0)
您可以随时使用抽象解决方案并将密钥与其值交换,将其存储在新地图中,然后搜索新地图:
val colors = Map(1 -> "red", 2 -> "blue")
def keyForValue(map: Map[Int, String], value: String) = {
val revMap = map map {_.swap}
val key = revMap(value)
key
}
第三行用键交换键值,并将其存储在revMap
中。 (map map
表示地图的名称,在本例中是参数,地图,然后是单词地图,然后是{_.swap}
实际用键替换键值。
答案 3 :(得分:0)
我会避免将地图传递给find方法,而只会将地图的键传递给find方法。
这避免了处理 Option [Int,String] -而是 Option [Int] 。
// sample data
val colors = Map(1 -> "red", 2 -> "blue", 3 -> "yellow")
// function you need
def keyForValue(theMap: Map[Int, String], theValue: String): Int = {
val someKey = theMap.keys.find( k => theMap(k) == theValue )
someKey match {
case Some(key) => {
println(s"the map contains ${key} -> ${theValue}")
return key
}
case None => {
println(s"a key was not found for ${theValue}")
return -1
}
}
}
这给出了:
scala> val result = keyForValue( colors, "blue" )
the map contains 2 -> blue
result: Int = 2
scala>