构建映射[String,String]



我有以下函数。它可以很好地打印我要存储的值。我想建立一个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

的内容

@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

这里有一个更惯用的方法:首先,我们制作一组我们关心的所有密钥:

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

注意,出于效率和逻辑的考虑,这可以在方法之外定义。

在该方法中,我们制作了一个具有Type属性的所有Stat元素的映射,然后使用我们的集合过滤密钥

  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)

(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

类似的东西

最新更新