我目前在scala中有一个Map,我需要检索与某个值匹配的键(或键!)。
我目前有学生和考试成绩的地图,需要能够找到我输入的学生得分的学生。
我的地图如下:
{{1}}
我如何搜索此地图以找到例如得分为71的学生然后返回该键?
提前致谢。
答案 0 :(得分:2)
您可以使用以下代码来实现此目的
students.filter(_._2 == 71).map(_._1)
答案 1 :(得分:1)
首先,您应该使用val
代替var
,如下所示:val students = Map("Neil" -> 97, "Buzz" -> 71, "Michael" -> 95)
其次,您可能想要的方法称为find
。
像这样students.find(_._2 == 71).map(_._1)
基本上说,找到值(_._2 == 71)
为71的第一个(键,值)对,然后抛出值.map(_._1)
。它将被包装在一个Option中,因为可能有0个匹配。
那就是说,除非你有什么东西要确保价值永远不会出现一次,否则你可能会对filter
的结果更满意。
答案 2 :(得分:1)
检查以下内容:
val students = Map("N" -> 87, "B" -> 71, "M" -> 95, "X" -> 95)
students.filter(_._2 == 95).keys
res3: Iterable[String] = Set(M, X)
答案 3 :(得分:-1)
简洁明了
只需收集给定分数的学生姓名。
student collect { case (name, 10) => name} headOption
使用Collect
val students = Map("Scala" -> 10, "Haskell" -> 20, "frege" -> 30)
student collect { case (name, 10) => name} headOption
上述代码收集得分为10的人的姓名,然后执行headOption以获得第一个人。如果没有匹配,上面的代码返回None。
Scala REPL输出
scala> val students = Map("Scala" -> 10, "Haskell" -> 20, "frege" -> 30)
students: scala.collection.immutable.Map[String,Int] = Map(Scala -> 10, Haskell -> 20, frege -> 30)
scala> students collect { case (name, 10) => name }
res3: scala.collection.immutable.Iterable[String] = List(Scala)
scala> students collect { case (name, 10000) => name }
res4: scala.collection.immutable.Iterable[String] = List()
scala> students collect { case (name, 10) => name } headOption
warning: there was one feature warning; re-run with -feature for details
res5: Option[String] = Some(Scala)