scala ArrayBuffer удаляет все элементы с помощью предиката

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)
  }
}

this фильтрует в линейное время и может быть смешан с любым буфером, но имеет смысл только ArrayBuffer, в ListBuffers он будет медленным, потому что индексирование действительно занимает линейное время.

5
задан Arne 5 April 2011 в 14:01
поделиться