Scala:如何返回包含值为item的值的项的键?

时间:2016-11-10 18:31:13

标签: scala dictionary 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
  } 
}

3 个答案:

答案 0 :(得分:2)

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 }

答案 1 :(得分:2)

如果您需要返回一个或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()

答案 2 :(得分:2)

collectFirst就是这样做的:

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可以用作函数本身(即applycontains相同)

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