2014-11-05 90 views
0
屬性

假設我有一個XML和地圖測試XML斯卡拉

val xml = 
<a> 
    <b x="x1" y="y1"/> 
    <b x="x2" y="y2"/> 
    <b x="x3" y="y3"/> 
</a> 

val m = Map("x1" -> "y1", "x2" -> "y2", "x3" -> "y3") 

我取出由XML <b>元素和檢查,如果該元素包含xy的屬性在地圖m

val bs = xml \\ "b" 
((bs \\ "@x").map(_.text) zip (bs \\ "@y").map(_.text)).toSet == m.toSet 

這段代碼的問題:

  • 代碼重複
  • bs通過兩次 等

你會如何修復/改善這種代碼?

+0

儘量http://codereview.stackexchange.com – 2014-11-05 11:57:58

+0

@ErikAllik你也許是正確的,但我更願意把我所有的編程問題在一個帳戶。 – Michael 2014-11-05 12:03:30

+0

所有stackexchange站點使用相同的登錄名。 – 2014-11-05 12:06:09

回答

1

什麼有關創建元組的列表,然後轉換設置:

scala> val m = Map("x1" -> "y1", "x2" -> "y2", "x3" -> "y3") 
m: scala.collection.immutable.Map[String,String] = Map(x1 -> y1, x2 -> y2, x3 -> y3) 

scala> m.toSet 
res56: scala.collection.immutable.Set[(String, String)] = Set((x1,y1), (x2,y2), (x3,y3)) 


scala> val m2 = bs map (node => ((node \\ "@x").text , (node \\ "@y").text )) 
m2: scala.collection.immutable.Seq[(String, String)] = List((x1,y1), (x2,y2), (x3,y3)) 

scala> m2.toSet 
res57: scala.collection.immutable.Set[(String, String)] = Set((x1,y1), (x2,y2), (x3,y3)) 

scala> m.toSet == m2.toSet 
res49: Boolean = true 
+0

謝謝。先創建一個元組列表更好。 – Michael 2014-11-05 15:21:05

+0

或者你也可以直接創建一個地圖。如你所願 – ccheneson 2014-11-05 15:27:36