Scala如何获取Map的键,其中值作为List

时间:2018-10-01 09:22:01

标签: scala

我有这样的地图:

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 _ =>    
        }

4 个答案:

答案 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