加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > 安全 > 正文

scala ArrayBuffer使用谓词删除所有元素

发布时间:2020-12-16 18:17:49 所属栏目:安全 来源:网络整理
导读:Scala在过滤不可变序列方面非常优雅: var l = List(1,2,3,4,5,6)l = l.filter(_%2==1) 但是我如何使用像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)
  }
}

这个过滤器在线性时间内可以混合到任何缓冲区中,但只有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)

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读