2

私は次の機能を持っています。私が保存しようとしている値を印刷するのにうまく機能します。Map[String, String] を作成したい

def storePlayerEntry(n: Node, moved: Boolean) = {

    moved match {
      // storing a current player record
      // rowkey = playerid
      case true => {
        //println("current: " + teamId + ":" + n)
        println("id: " + n \ "@uID")
        for (
          s <- Seq("first_name",
            "last_name",
            "known_name",
            "birth_date",
            "weight",
            "height",
            "jersey_num",
            "real_position",
            "real_position_side",
            "join_date",
            "country")
        ) {
          val stat = (n \\ "Stat").filter(_.attribute("Type").filter(_.toString() == s).isDefined)
          Option(stat.text) match {
            case Some(st) if (st == "") => // do nothing
            case Some(st) => println(st)
            case None => // do nothing
          }
        }
        //val ret = dataApi.upsertMulti("players", 
      }
      case false => {
        //println("old: " + teamId + ":" + n)            
      }
    }
  }

私はマップを宣言することを避け、メソッドを追加するだけです。これは、ここでもっとスカラっぽいことを行う必要があると確信しているためです。

私が探しているマップには、 s -> st のようなものが含まれます

4

3 に答える 3

2

@jdevelopは近いです。これである必要があります:

val x = (for (
              s <- Seq("first_name",
                "last_name",
                "known_name",
                "birth_date",
                "weight",
                "height",
                "jersey_num",
                "real_position",
                "real_position_side",
                "join_date",
                "country");
              val st = (n \\ "Stat").filter(_.attribute("Type").filter(_.toString() == s).isDefined).text if (st != "")
            ) yield (s -> st)).toMap
于 2012-08-30T23:13:05.740 に答える
2

より慣用的なアプローチを次に示します。まず、関心のあるすべてのキーのセットを作成します。

val keys = Set(
 "first_name",
 "last_name",
 "known_name",
 "birth_date",
 "weight",
 "height",
 "jersey_num",
 "real_position",
 "real_position_side",
 "join_date",
 "country"
)

これは、効率とロジックの両方のために、メソッドの外部で定義できることに注意してください。

メソッド内で、属性Statを持つすべての要素のマップを作成Typeし、セットを使用してキーをフィルター処理します。

  val stats: Map[String, String] = (n \\ "Stat").flatMap {
    s => s.attribute("Type").map(_.toString -> s.text)
  }.toMap.filterKeys(keys)

これで、関心のあるキーから適切なStat要素のテキスト コンテンツへのマップができました。たとえば、n次のように見えるとします。

<Player uID="john">
  <Stat Type="first_name">John</Stat>
  <Stat Type="last_name">Doe</Stat>
  <Stat Type="some_irrelevant_thing">blah</Stat>
</Player>

必要に応じて、結果は になりMap(first_name -> John, last_name -> Doe)ます。

于 2012-08-30T23:25:58.473 に答える
0
(for (
      s <- Seq("first_name",
        "last_name",
        "known_name",
        "birth_date",
        "weight",
        "height",
        "jersey_num",
        "real_position",
        "real_position_side",
        "join_date",
        "country");
      val Some(st) = (n \\ "Stat").filter(_.attribute("Type").filter(_.toString() == s).isDefined)
      if (st != "")
    ) yield (s -> st)).toMap

そんな感じ

于 2012-08-30T23:01:18.323 に答える