scala ArrayBuffer 删除带有谓词的所有元素

2024-03-13

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 上它会很慢,因为索引确实需要线性时间。


我的猜测是,通过构建新的缓冲区来过滤会更有效,因此您通常只使用filter并使用它的结果。否则,您可以编写自己的就地过滤方法:

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)
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

scala ArrayBuffer 删除带有谓词的所有元素 的相关文章

随机推荐

  • id 的值相同(浮点数)

    据我所知 Python 中的一切都是对象id 应该 我对吗 为每个对象返回不同的数字 就我而言 id 1 回报4298178968 id 2 回报4298178944但我对所有浮点类型都得到相同的值 id 1 1 回报4298189032
  • 集合的 EF Code First 映射

    我首先使用 EF 4 1 RC 代码 我在连接表 Friends 中有一个使用复合 PK 的多对多关系 我们明确需要一个单独的 Friends 类 不要问 来代表我们的联结表 我们的目标是能够控制用户实体的删除过程 请在阅读其余部分之前先阅
  • 如何在 R 中操作(聚合)数据?

    我有一个数据集 如下所示 df lt tribble id price number of book 1 10 3 1 5 1 2 7 4 2 6 2 2 3 4 3 4 1 4 5 1 4 6 1 5 1 2 5 9 3 正如您在数据集中
  • CData部分未完成问题

    当我对下面的 XML 使用 DOMDocument loadXML 时 出现错误 Warning DOMDocument loadXML domdocument loadxml CData section not finished http
  • 在 Chrome 中的密码字段上使用 setCustomValidity 时出现不可读的文本

    如果我在 html5 表单密码字段上使用 setCustomValidity 设置错误消息 它会像密码字段本身一样弹出为气泡或星星 从而导致不可读的消息 这是一个 jsfiddle 来演示我的意思 http jsfiddle net Lcf
  • 在序言中返回列表

    我想问一个关于返回列表的问题 事实 团队 团队名称 总监 国籍 总体目标 team milan allegri italy 8 5 team inter benitez italy 7 6 team barcelona guardiola
  • 在WHMCS中将专用IP显示到viewinvoice.tpl和invoicepdf.tpl中?

    您好 堆栈我有一个问题不知道如何解决 我想显示客户订单中的专用 IP 如下所示 我做了一个简短的检查 发现需要完成查看发票 tpl and 发票pdf tpl文件 我发现专用IP被存储到tbl主机数据库中的表 我找到了这段代码 php cl
  • 在C#中修改XML现有内容

    目的 我计划使用 XmlTextWriter 创建一个 XML 文件 并使用 XmlNode SelectSingleNode node ChildNode InnerText someting 等修改 更新一些现有内容 我使用 XmlTe
  • 如何将 autodie 与非内置函数一起使用?

    autodie 文档暗示 除了默认情况下可以处理的内置函数之外 还可以将它用于其他功能 但没有明确的示例如何在其中执行此操作 具体来说 我想将它用于成像器模块 其中的很多函数和方法都可能会失败 如果这不意味着我的代码会到处都是 我更愿意or
  • 在 PHP 中按多维数组分组并用逗号连接结果(不会创建不必要的逗号)

    我需要将二维数组中的行按两列分组 然后在每个组中 我需要用逗号连接另一列的值 请注意 在第三行中 诊断值为空 data id gt 1 begin gt 01 01 diagnostic gt a id gt 1 begin gt 01 0
  • 使用 getScript 加载 jQuery UI

    我正在尝试构建一个需要人员加载 jQuery 和 jQuery UI 的小部件 加载 jQuery 不是问题 但在标题中添加 ui 却不起作用 而且我不断收到此错误 b is undefined Break on this error fu
  • 集合被修改,枚举操作可能无法执行

    我有多线程应用程序 但收到此错误 Exception Text System InvalidOperationException Collection was modified enumeration operation may not e
  • Bash 将文件移动到同名文件夹[重复]

    这个问题在这里已经有答案了 如果我将其发布在错误的位置 我提前道歉 我对脚本编写非常陌生 更不用说 stackoverflow 了 我有许多以以下结尾的文件 conf与多个同名文件夹 不带后缀 位于同一目录中 conf扩大 例如 我的目录如
  • Codesign 返回未知错误 -1=ffffffffffffffff

    我尝试对 iOS 应用程序进行代码签名 这些是我遵循的步骤 security create keychain p password KEYCHAIN security set keychain settings u t 300 KEYCHA
  • 图像在幻灯片上旋转

    我正在使用引导轮播插件来幻灯片显示照片 问题是有些图像旋转了 90 度 有什么办法可以解决这个问题吗 这是 HTML div class container div class row div class col md 8 col md o
  • 如何检查任何类型的变量是否是数组

    我尝试将 swift 协议数组转换为任何数组 但失败了 protocol SomeProtocol class class SomeClass NSObject SomeProtocol let protocolArray SomeProt
  • 如何为“插入”表单中的字段传递默认值?

    如何为 插入 表单中的字段传递默认值 我正在使用 Meteor 的软件包 Autoform Collections2 和 Simple Schema 我的流程是 用户在页面列表中选择某个值 然后 打开 插入 我希望使用用户在上一步中选择的值
  • 如何用c++语言中的tensorflow.so和c_api.h加载图?

    我找不到任何有关如何加载图表的示例tensorflow so and c api h在C 中 我读了c api h 但是 那ReadBinaryProto功能不在其中 如何在没有ReadBinaryProto功能 如果您使用 C 您可能需要
  • 为派生类专门化 std::hash 在 gcc 中有效,而不是 clang

    我正在努力专攻std hash对于派生类 迄今为止最好的方法是基于这个答案 https stackoverflow com a 31213703 620382 include
  • scala ArrayBuffer 删除带有谓词的所有元素

    Scala 在过滤不可变序列方面非常优雅 var l List 1 2 3 4 5 6 l l filter 2 1 但是如何使用像 ArrayBuffer 这样的可变集合来做到这一点呢 我发现的只是删除单个元素或切片 或者从另一个序列中删