2014-11-05 93 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