scala集合循环缓冲区

2024-04-08

只是在这里用循环缓冲区搞乱。这是一个明智的实现,还是有更快/更可靠的方法来给这只猫剥皮?

class CircularBuffer[T](size: Int)(implicit mf: Manifest[T]) {

    private val arr = new scala.collection.mutable.ArrayBuffer[T]()

    private var cursor = 0

    val monitor = new ReentrantReadWriteLock()

    def push(value: T) {
      monitor.writeLock().lock()
      try {
        arr(cursor) = value
        cursor += 1
        cursor %= size
      } finally {
        monitor.writeLock().unlock()
      }
    }

    def getAll: Array[T] = {
      monitor.readLock().lock()
      try {
        val copy = new Array[T](size)
        arr.copyToArray(copy)
        copy
      } finally {
        monitor.readLock().unlock()
      }
    }
  }

Creation

对现有 scala 集合类和附加函数的类型声明比“滚动自己的”更容易实现。正如评论中所指出的,此实现可能不如“真正的”循环缓冲区那么高效,但它只需很少的编码即可完成工作:

import scala.collection.immutable

type CircularBuffer[T] = immutable.Vector[T]

def emptyCircularBuffer[T] : CircularBuffer[T] = immutable.Vector.empty[T]

def addToCircularBuffer[T](maxSize : Int)(buffer : CircularBuffer[T], item : T) : CircularBuffer[T]  =
  (buffer :+ item) takeRight maxSize

这意味着您的“CircularBuffer”实际上是一个 Vector,您现在可以免费获得所有相应的 Vector 方法(filter、map、flatMap 等):

var intCircularBuffer = emptyCircularBuffer[Int]

//Vector(41)
intCircularBuffer = addToCircularBuffer(2)(intCircularBuffer, 41)

//Vector(41, 42)
intCircularBuffer = addToCircularBuffer(2)(intCircularBuffer, 42)

//Vector(42, 43)
intCircularBuffer = addToCircularBuffer(2)(intCircularBuffer, 43)

//Vector(42)
val evens : CircularBuffer[Int] = intCircularBuffer filter ( _ % 2 == 0)

Indexing

您可以类似地添加一个用于循环索引的函数:

def circularIndex[T](buffer : CircularBuffer[T])(index : Int) : T = 
  buffer(index % buffer.size)
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

scala集合循环缓冲区 的相关文章

随机推荐

  • 将 SQL 转换为 LINQ to SQL

    我在将以下 SQL 转换为 LINQ to SQL 时遇到了很大的麻烦 有人能帮忙吗 SELECT dbo ExpensesGroup ExpenseGroupId dbo ExpensesGroup Title SUM dbo Expen
  • 如何更改 XAMPP apache 服务器端口?

    这是我的 Apache httpd conf 设置 Listen 8012 ServerName localhost 8012 每次我通过以下方式启动 ApacheXAMPP我看到这条消息 Status Check OK Busy Apac
  • 抓取 asp.net 页面时发生 EVENTVALIDATION 错误

    我需要从中获取一些值website http www uninor in UninorConnAssist locate a store Pages locate a store aspx 基本上我需要获取每个城市的面积 我为此使用 Pyt
  • PUT 中的 Azure Blob 存储文档中的“404 资源未找到”

    期间PUT请求 具有正确的授权标头 这会创建一个新的 BLOB 当我尝试执行以下操作时 我的进程收到 404 Resource Not Found 错误PUT将文件放入容器中 https accountNameHere blob core
  • 如何创建 C# 事件来处理来自 PostMessage() 的 MFC Windows 消息

    我有一个使用 WINSOCK 的托管 C DLL 接收时 它通过 PostMessage 向 CWnd 发送一条自定义消息 当从非托管 C 调用时 这可以正常工作 使用以下代码构建后 将目标 CWnd 注册到 C 类 Registers a
  • 如何在使用路径别名导入的文件上使用 Babel?

    我正在设置构建脚本 以便在我的网络应用程序的某些路由上进行服务器端渲染 我正在使用 React 和 Firebase 现在 我的项目结构是 root gt buildScripts Some build scripts to replace
  • ggpubr:在标签中显示显着性水平(*** 或 n.s.)而不是 p 值

    我想显示显着性水平 or n s 作为我的线性回归中的标签使用ggpubr在 R 中 这似乎是通过使用来完成的aes label p signif 如此处发布的 https www r bloggers com add p values a
  • 即使加载了 SqlP,也无法识别 invoke-sqlcmd

    我正在尝试创建一个 shell 脚本来运行查询并存储输出 到目前为止我的脚本如下所示 push location import module SqlPs Pop Location myData invoke sqlcmd InputFile
  • 如何在不同屏幕上显示相同的广告横幅?

    我已将 AdMob 横幅添加到应用程序的第一个屏幕 现在我需要它在其他一些屏幕上 不同的活动 如何在不重新加载横幅的情况下实现它以避免额外使用流量 Thanks 对于想要演示代码的人 我在我的应用程序中实现了它 使用一个Activity 多
  • 多线程安全消息队列

    这是我基本上拥有的 我有线程 A 定期检查消息并处理它们 线程B和C需要向A发送消息 当 B 和 C 或 B 或 C 尝试向 A 发送消息 而 A 正在处理消息并访问队列时 就会出现问题 这个问题通常是如何解决的 Thanks 这通常可以使
  • 从一个程序执行并捕获另一个程序

    在 win32 中用 C 编程 在另一个 win32 程序中执行 win32 控制台程序并让启动执行的程序捕获输出的最佳方法是什么 目前我使程序将输出重定向到文件 但我确信我必须能够打开某种管道 Use the CreateProcess
  • 构建 HTML 电子邮件,我可以将样式放在标题部分还是必须使用内联样式?

    我必须使用基本的 HTML 和 CSS 构建一些电子邮件模板 我已经发现这一页 http www campaignmonitor com css 其中详细介绍了各种电子邮件客户端最支持哪些 CSS 样式 我知道这些将作为内联样式工作 不过
  • 为什么我的执行计划中出现了排序?

    我下面的 sql 查询运行速度非常慢 我查看了执行计划 它声称对 Files OrderId 进行排序是成本最高的操作 53 如果我没有在任何地方通过 OrderId 订购 为什么会发生这种情况 我最好的选择是在 File OrderId
  • 使用 cql 从 python 插入到 cassandra

    我计划将数据插入到具有复合键的波纹管 CF 中 CREATE TABLE event attend event id int event type varchar event user id int PRIMARY KEY event id
  • 如何检查哪个 Django 中间件是同步的还是异步的?

    我正在使用 Django 3 1 我想看看是否可以使用 async 来处理我的 webhook 以便提供更快的响应 From 异步视图 https docs djangoproject com en 3 1 topics async asy
  • 为什么map任务总是运行在单节点上

    我有一个具有 4 个节点的完全分布式 Hadoop 集群 当我将作业提交给 Jobtracker 时 Jobtracker 认为 12 个映射任务对我的工作来说很酷 但奇怪的事情发生了 这 12 个映射任务始终在单个节点上运行 而不是在整个
  • 计算持续时间

    我有一个小的android问题 我需要一个计时器来计算从特定活动打开到单击该活动中的某个按钮的持续时间 即活动打开的时间 在谷歌搜索时 我发现了 TimerTask 但这似乎只在一定的时间间隔内运行一个线程 从我的 Android 经验来看
  • 带两个参数的 Matplotlib 颜色图

    我试图代表两个变量x and y在地图上使用颜色 到目前为止 我能达到的最好效果是对一个变量使用颜色 对另一个变量使用透明度 plt Polygon shape points fill False color cmap y alpha x
  • 缺少 CrudRepository#findOne 方法

    我在我的项目中使用 Spring 5 直到今天还有可用的方法CrudRepository findOne https docs spring io spring data commons docs current api org sprin
  • scala集合循环缓冲区

    只是在这里用循环缓冲区搞乱 这是一个明智的实现 还是有更快 更可靠的方法来给这只猫剥皮 class CircularBuffer T size Int implicit mf Manifest T private val arr new s