[英]looping through multimap values
我有一个像这样的scala多图
Key: fish value: Set:(salmon,batam fish, shark)
Key: winged animals value: Set:(chicken, ducks)
我有一个看起来像这样的字符串文本:
val string = "the market had sold salmon and chicken"
由于字符串中包含鲑鱼和鸡肉,因此我需要退回钥匙鱼和有翼动物。
有没有办法遍历值集并在存在匹配项时返回键? 我可以遍历键值对,但只能得到上面显示的多图,而不能得到单个值。
谢谢
val index: Map[String, Set[String]] = Map(
"Fish" -> Set("salmon", "batam", "shark"),
"Winged Animals" -> Set("chicken", "ducks"),
"Other" -> Set("cow", "pig")
)
def typesInString(search: String): Set[String] = index.filter {
case (t, vals) =>
vals.exists(search.contains)
}.keys.toSet
typesInString("the market had sold salmon and chicken")
// Set(Fish, Winged Animals)
一种方法是从MultiMap创建反向Map以进行值键查找,如下所示:
import collection.mutable.{ Set, HashMap, MultiMap }
val text = "the market had sold salmon and chicken"
val mm = new HashMap[String, Set[String]] with MultiMap[String, String]
mm.addBinding("fish", "salmon")
mm.addBinding("fish", "batam fish")
mm.addBinding("fish", "shark")
mm.addBinding("winged animals", "chicken")
mm.addBinding("winged animals", "ducks")
val reverseList = for {
mList <- mm.toList
mValue <- mList._2
}
yield (mValue, mList._1)
// Use groupBy instead of toMap (*)
val reverseMap = reverseList.groupBy(_._1).mapValues(_.map(_._2))
// reverseMap: scala.collection.immutable.Map[String,List[String]] = Map(
// salmon -> List(fish), ducks -> List(winged animals), chicken -> List(winged animals),
// shark -> List(fish), batam fish -> List(fish)
// )
text.split("\\s+").collect{
case x if reverseMap.contains(x) => reverseMap(x)
}
// res1: Array[List[String]] = Array(List(fish), List(winged animals))
(*)注意groupBy
,代替toMap
,被施加到reverseList
以允许属于多个组的动物; 这也是为什么结果是嵌套集合的原因(例如,蝙蝠可能属于List(哺乳动物,有翅膀的动物))。
在不循环使用键值对的情况下,仅使用自己的MultiMap
方法,我们仍然必须循环通过键:
val items: MultiMap[String, String] = ...
val string = "the market had sold salmon and chicken"
val matched = items.keys.filter(key => items.entryExists(key, string.contains(_)))
println(matched)
// Set(winged animals, fish)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.