我喜歡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