在scala中使用地图的查找函数

在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 } 当我知道值时,如何迭代映射并

我试图在给定值的地图中找到一个键。我正在使用“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
  }

当我知道值时,如何迭代映射并找到键?

映射中
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
可以获得结果对的第一个元素,在映射的情况下,该元素恰好是键。