2012-08-30 164 views
2

我有以下功能。它適用於打印我想要存儲的值。我想建立一個地圖[字符串,字符串]構建地圖[字符串,字符串]

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

回答

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 
+0

真棒...謝謝@chiappone。我不能投票了...我的代表太低了:( – kyleroche

+0

去了這個和特拉維斯的混合。) 'var x =(for(s < - playerKeys; val st =(n如果(st!=「」&& st!=「Unknown」)(「!Stat」)。filter( _.attribute(「Type」).filter(_ .toString()== s).isDefined).text if ))yield(s - > st))toMap' – kyleroche

+0

@kyleroche:請注意,由於您正在搜索節點序列(更不用說創建'NodeSeq' )爲每個鍵。 –

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 

類似的東西

+0

如果過濾器返回'None',則會中斷,但使用st < - // filter'代替 – drexin

+0

它不會中斷,但會跳過該值並取下一個值,這是我理解的期望行爲。 – jdevelop

+0

jdevelop - 感謝它的發展! – kyleroche

2

這裏有一個更地道的方法:首先,我們制定一套我們關心的關鍵:

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),根據需要。

相關問題