2013-10-24 58 views
7

我想在一个地图中找到一个键,给定一个值。我现在用的是“查找”功能,通过不能够弄清楚了它的正确谓词:使用查找功能的地图在斯卡拉

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 
    } 

如何遍历在地图上,并找到钥匙,当我知道的价值?

回答

10

您使用同一种谓词与一个List,但请记住,你评估它超过(key,value),而不仅仅是值(并得到一对巴ck以及!)

简单的例子:

val default = (-1,"") 
val value = "red" 
colors.find(_._2==value).getOrElse(default)._1 
+0

它返回一个Some(1,“红色”)。我从中提取密钥? –

+3

@Core_Dumped:我从接受中假设你可能已经想通了,但以防万一:如果你运行代码,因为它实际上在答案中,你会得到密钥这是'.getOrElse(default)._ 1'的意思,它从'find'中提取''Option'的值,给定默认值,用'_1'获得结果对的第一个元素,这恰好是地图情况下的关键。 –

2

findMap的签名是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) 
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}实际交换密钥与它们的值。