在地图中搜索项目

时间:2013-07-23 01:54:54

标签: scala map

我是scala的新手,我的目标是迭代列表并检查列表中的项目是否存在地图作为其键,如果它们存在则返回该键的值。

我做了以下事情:

  def getMatchingValues(listItmes: List[String]) = {
    for (item <- listItems) {
      theMap.keys.foreach { i =>
        if (i.equals(item)) {
          theMap(i)
        }
        "NoMatch"
      }
    }
  }

我想知道是否有更好的方法在scala中执行此操作?

4 个答案:

答案 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 Listval 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}}

这将给你完全相同的结果。