我是scala的新手,我的目标是迭代列表并检查列表中的项目是否存在地图作为其键,如果它们存在则返回该键的值。
我做了以下事情:
def getMatchingValues(listItmes: List[String]) = {
for (item <- listItems) {
theMap.keys.foreach { i =>
if (i.equals(item)) {
theMap(i)
}
"NoMatch"
}
}
}
我想知道是否有更好的方法在scala中执行此操作?
答案 0 :(得分:4)
地图有一个getOrElse
方法可以满足您的需求:
def getMatchingValues(listItems: List[String]) = listItems map (theMap.getOrElse(_,"NoMatch"))
至少我认为这就是你想要的。这是一个例子:
scala> val theMap = Map("a"->"A", "b" -> "B")
theMap: scala.collection.immutable.Map[String,String] = Map(a -> A, b -> B)
scala> val listItems = List("a","b","c")
listItems: List[String] = List(a, b, c)
scala> listItems map (theMap.getOrElse(_,"NoMatch"))
res0: List[String] = List(A, B, NoMatch)
答案 1 :(得分:2)
flatMap的可能解决方案:
/* Return Some[String] if found, None if not found, then flatten */
def getMatchingValues(listItems: List[String], theMap: Map[String, String]): List[String] =
listItems.flatMap(item => theMap.get(item))
/* Same thing with some syntactic sugar */
def getMatchingValuesSmartass(listItems: List[String], theMap: Map[String, String]): List[String] =
listItems flatMap theMap.get
val l = List("1", "3", "5", "7")
val m = Map("5" -> "five", "2" -> "two", "1" -> "one")
getMatchingValues(l, m)
getMatchingValuesSmartass(l, m)
答案 2 :(得分:1)
您可以使用map.get方法并使用模式匹配处理结果
list.map { x => map.get(x) match {
case None => "No match"
case Some(i) => (x, i)
}}
上面的代码返回一对对列表,其中每对代表列表的元素和地图中关联的值(如果没有找到,则为“不匹配”)
答案 3 :(得分:1)
如果我是你,我会做两步。鉴于此Map
:
val map = Map("a" -> "b", "b" -> "c", "c" -> "d", "d" -> "e")
和List
:
val list = List("a", "c", "e")
首先,我会map
Option
List
中val mapped = list.map(item => item -> map.get(item))
的每个项目。如果物品有值,则给你。
mapped: List[(String, Option[String])] =
List(("a",Some("b")), ("c",Some("d")), ("e", None))
这会给你这个:
get
在地图上调用Some
会返回包装结果。如果有结果,您将获得包含在None
中的结果。否则你将获得Option
。两者都是Option
null
的子类是一个闭包构造,它为您提供了一个空值而无需处理map
。现在,您可以再次val result = mapped.map(tuple => tuple._1 -> tuple._2.getOrElse("No match"))
result: List[(String, String)] = List(("a","b"), ("c","d"), ("e","No match"))
来实现目标。
getOrElse
Some
会提取None
的值,如果是val result = list.map(item => item -> map.get(item).getOrElse("No match"))
则会回退到参数。
为了使它看起来更专业,我们可以将这个表达式写成一行;)
{{1}}
这将给你完全相同的结果。