在scala中使用地图的查找函数
我试图在给定值的地图中找到一个键。我正在使用“find”函数,因为我无法为它找出正确的谓词:在scala中使用地图的查找函数,scala,map,Scala,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 } 当我知道值时,如何迭代映射并
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
}
当我知道值时,如何迭代映射并找到键?映射中
find
的签名是find(p:((A,B))⇒ 布尔):选项[(A,B)]
。因此谓词接受一个Tuple2
,并且必须返回一个布尔值。注:我将值
更改为Int
,因为颜色中的键也是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)]
测试:
您还可以使用get
:
scala> colors.get(1)
res1: Option[String] = Some(red)
您使用与列表
相同类型的谓词,但请记住,您是在对(键、值)
对进行求值,而不仅仅是值(并获取一对!)
// 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
}
}
}
简单的例子:
val default = (-1,"")
val value = "red"
colors.find(_._2==value).getOrElse(default)._1
您可以始终使用抽象解决方案,将键与其值交换,将其存储在新映射中,然后搜索新映射:
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
表示映射的名称,在本例中是参数map,然后是单词map,然后是{uu.swap}
,以实际交换键及其值。我会避免将映射传递给find方法,而只将映射的键传递给find方法
这避免了处理选项[Int,String]——而是选项[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>
它返回一个Some(1,“red”)。我可以从中提取密钥吗?@Core\u Dumped:我假设从accept中您可能已经找到了答案,但以防万一:如果您按照答案中的实际情况运行代码,您将获得密钥。这就是.getOrElse(默认值)._1
用于。它从选项中提取值,该选项是从查找中获得的,给定默认值,使用_1
可以获得结果对的第一个元素,在映射的情况下,该元素恰好是键。