Rob*_*een 3 loops scala scala-collections
我想使用单个循环迭代一个元素的所有元素Set,然后迭代另一个元素Set.(我不关心重复,因为我碰巧知道两者Set是不相交的.)
我想在一个循环中完成它的原因是因为我有一些额外的代码来测量进度,这需要它在一个循环中.
这通常不起作用,因为它可以Set任意混合两个s:
for(x <- firstSet ++ secondSet) {
...
}
Run Code Online (Sandbox Code Playgroud)
这可行,但Seq在内存中构建了3个中间版,因此在时间和空间使用方面效率太高:
for(x <- firstSet.toSeq ++ secondSet.toSeq) {
...
}
Run Code Online (Sandbox Code Playgroud)
Rob*_*een 11
for(x <- firstSet.toIterator ++ secondSet.toIterator) {
...
}
Run Code Online (Sandbox Code Playgroud)
这不构建任何中间数据结构,所以我认为这是最有效的方式.
如果你只是想要一个遍历,并且你想要最大的性能,这是最好的方法,即使它是丑陋的:
val s1 = Set(1,2,3)
val s2 = Set(4,5,6)
val block : Int => Unit = x => { println(x) }
s1.foreach(block)
s2.foreach(block)
Run Code Online (Sandbox Code Playgroud)
由于这非常难看,您可以为它定义一个类:
def traverse[T](a:Traversable[T], b:Traversable[T]) : Traversable[T] =
new Traversable[T] {
def foreach[U](f:T=>U) { a.foreach(f); b.foreach(f) }
}
Run Code Online (Sandbox Code Playgroud)
然后像这样使用它:
for(x<-traverse(s1, s2)) println(x)
Run Code Online (Sandbox Code Playgroud)
但是,除非这对性能至关重要,否则Robin Green发布的解决方案会更好.开销是创建两个迭代器并连接它们.如果你有更深层次的嵌套数据结构,那么连接迭代器可能会非常昂贵.例如,通过连接子树的迭代器定义的树迭代器将非常缓慢,而在每个子树上调用foreach的树遍历将接近最优.