我有一个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
}
}
答案 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
可以用作函数本身(即apply
与contains
相同)
m.collectFirst{case (k,v) if v("z") => k}
//> res0: Option[Int] = Some(3)