Scala在过滤不可变序列方面非常优雅:
var l = List(1,2,3,4,5,6) l = l.filter(_%2==1)
但是我如何使用像ArrayBuffer这样的可变集合呢?
我发现的只是删除单个元素或切片,或从另一个序列中删除元素,但没有删除谓词给出的元素.
编辑:
我希望找到类似的东西:
trait Removable[A] extends Buffer[A]{ def removeIf(p: A => Boolean){ var it1 = 0 var it2 = 0 while(it2 < length){ if( p( this(it2) ) ){ it2 += 1; } else { this(it1) = this(it2) it1 += 1; it2 += 1; } } trimEnd(it2-it1) } }
这个过滤器在线性时间内可以混合到任何缓冲区中,但只有ArrayBuffer才有意义,在ListBuffers上它会很慢,因为索引确实需要线性时间.
解决方法
我的猜测是通过构建一个新缓冲区进行过滤更有效,所以通常只使用过滤器并使用其结果.否则,您可以编写自己的就地过滤方法:
def filterInPlace[A](b: collection.mutable.Buffer[A])(fun: A => Boolean): Unit = { var sz = b.size var i = 0; while(i < sz) { if (fun(b(i))) { i += 1 } else { sz -= 1 b.remove(i) } } } val b = collection.mutable.ArrayBuffer((1 to 6): _ *) filterInPlace(b)(_ % 2 == 1) println(b)
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。