我喜欢retronym的drop(n).headOption
模式,因为它比你的孩子少于n
。但我认为你的意思是第二个子节点(不包括文本节点),而不是<foo>
标签的第二个实例。考虑到这一点,对你的回答结合或使用partialMap
:
node.child.partialMap{case x:scala.xml.Elem => x}.drop(n).headOption
node.child.filter(_.isInstanceOf[scala.xml.Elem]).drop(n).headOption
这有可能认为你不会想在提取文本:
val node = <something><foo/>text</something>
效率明智的,唯一的我能想到的一点是,如果你想在有大量的孩子的时候检索第二个孩子,那么就要过滤器懒惰。我认为这可以通过运行node.child.iterator
上的过滤器来实现。
编辑: 更改toIterable
到iterator
。 好点,在ArrayBuffer
上调用drop(n)
会导致额外的分配,也有多少很难说,因为看起来drop
在IndexSeqLike
中被覆盖。但是使用迭代器也会解决这个问题。因此,对于大量的儿童:
node.child.iterator.filter(_.isInstanceOf[scala.xml.Elem]).drop(n).next
如果你想拥有它是安全的,你可能需要定义一个函数来检查hasNext
。
所有这些仅在2.8中进行了测试。
因此,drop(n).headOption为我提供了安全性,但效率并不高?由于孩子返回ArrayBuffer,使其迭代可以避免仅过滤成本,对吗? – 2010-02-18 11:56:52