Scala:如何返回值中包含一个项目的键,其中value是Set



我有一个Map[Int, Set[Int]],给定一个项目,我想返回索引到该项目存在的Set的键。例如,如果我有一个Map(1 -> Set("a"), 2 -> Set("b"), 3 -> Set("c","z"))。假设项目是"z",我想返回3,因为3是索引包含3的集合的键。这是我目前拥有的,但我似乎找不到一个好的方法来获得钥匙。我只能得到值,Set[Int]。假设项目只在一个可能的集合中。

def find(djs: Map[Int, Set[Int]], item: Int) :Int = {
for ((key, set) <- djs) {
  if (set.contains(item)) {
    key
  } 
}

collectFirst for this:

val m = Map(1 -> Set("a"), 2 -> Set("b"), 3 -> Set("c","z"))
m.collectFirst{case (k,v) if v.contains("z") => k}
//> res0: Option[Int] = Some(3)

和我总是忘记Set可以作为一个函数本身(即apply是相同的contains)

m.collectFirst{case (k,v) if v("z") => k}
//> res0: Option[Int] = Some(3)

如果您需要返回一个或None,那么Option[]将是您的选择。如果需要返回一个、多个或不返回,那么返回List[]可能是顺序的。

val m = Map(1 -> Set("a"), 2 -> Set("b"), 3 -> Set("c","z"))
m.flatMap{ case (k,vs) => if (vs.contains("z")) Seq(k) else Seq() }  // List(3)
m.flatMap{ case (k,vs) => if (vs.contains("w")) Seq(k) else Seq() }  // List()

find操作符在这里可以很好地工作:

def find[A, B](m: Map[A, Set[B]], item: B): Option[A] = 
    m.find { case (key, set) => set.contains(item) }
     .map  { case (key, set) => key }

最新更新