0

私はscalaを初めて使用します。私の目的は、リストを反復処理し、リスト内のアイテムがキーとしてマップに存在するかどうかを確認し、存在する場合はそのキーの値を返すことです。

私は次のことをしました:

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

scalaでこれを行うためのより良い方法があるかどうかを理解しようとしていますか?

4

4 に答える 4

4

Map には、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)
于 2013-07-23T02:03:49.510 に答える
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)
于 2013-07-23T02:19:13.027 に答える
1

私があなたなら、2 つのステップを実行します。これを考えるとMap

val map = Map("a" -> "b", "b" -> "c", "c" -> "d", "d" -> "e")

そしてこれList

val list = List("a", "c", "e")

最初にmapOption内のすべてのアイテムに値を設定します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. 両方とも is のサブクラスでOption Optionあり、 を処理しなくても null 値を提供するクロージャー コンストラクトです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

よりプロフェッショナルに見せるために、この式を 1 行で記述できます ;)

val result = list.map(item => item -> map.get(item).getOrElse("No match"))

これにより、まったく同じ結果が得られます。

于 2013-07-23T08:07:06.270 に答える
1

map.get メソッドを使用して、パターン マッチングで結果を処理できます。

list.map { x => map.get(x) match {
  case None => "No match"
  case Some(i) => (x, i)
}}

上記のコードは、各ペアがリストの要素とマップに関連付けられた値を表すペアのリストを返します (見つからない場合は「一致しません」)。

于 2013-07-23T05:23:40.567 に答える