我有一个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 }