我有这样的地图:
val myMap = Map(
testKey1 -> List(testValue1, testValue2, testValue3....),
testKey2 -> List(testValue4, testValue5, testValue6....),
testKey3 -> List(testValue7, testValue8, testValue9....)
)
我想对列表值进行一些精确匹配,并获取对应的map键。
例如示例:我要检查“ testValue9 ”是否在此映射中,然后将获得键“ testKey3 ”。
我认为可以通过这种方式解决,但我无法遍历list的值来检查该值是否存在。 或者有人可以给我一些提示。
myMap foreach {
case (key, List(_)) => println( key )
case _ =>
}
答案 0 :(得分:3)
我想这样做:
假设键是String,值是List [String]
val keyContainsValue: immutable.Iterable[String] = myMap map {
case (key, value) => if (value.contains(testValue9)) key else ""
}
您可以使用空字符串作为默认值,以便获得返回类型为iterable [String]。
由于我不知道您的键的类型和值,您也可以使用option。为此目的。
val keyContainsValue: immutable.Iterable[Option[String]] = myMap map {
case (key, value) => if (value.contains(testValue9)) Some(key) else None
}
println(keyContainsValue.flatten) //you will get the list of keys which contains the value specified.
答案 1 :(得分:2)
如果您尝试在def get_summary_statistics(self):
#[START getting the Summary Statistics]
stats = self.client.query(kind= self.kind_name)
overall_stats = stats.__Stat_Total__ ()
return overall_stats
中查找单个值,则可以使用Map
:
find
如果找到该值,它将返回 myMap.find(_._2.contains(value)).map(_._1)
,否则返回Some(key)
。
如果您认为可能有多个匹配值,则可以将None
替换为find
filter
或使用 myMap.filter(_._2.contains(value)).map(_._1)
collect
在两种情况下,这都将返回所有匹配键的列表,并取决于实现 myMap.collect{ case (k, v) if v.contains(value) => k }
的方式。
请注意,可以使用Map
表达式来表达filter
选项,该表达式的作用完全相同:
for
尽管 for { (k,v) <- myMap if v.contains(value) } yield k
可能表现最好,但在大多数情况下,这只是样式问题,哪个更好。
拉曼·米什拉(Raman Mishra)指出过滤器版本可以简化为
collect
这将返回myMap.filter(_._2.contains(value)).keys
而不是Set
,因为顺序不重要,因此更合适。
答案 2 :(得分:1)
val searchValue = "testValue9"
myMap.collect{ case (key, values) if values.contains(searchValue) => key }
答案 3 :(得分:0)
您可以做类似的事情
val getKeys = (k: String) => for (m<- myMap.keys;
v<- myMap(m);
if v==k) yield m