繁体   English   中英

遍历多图值

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM