arrays - 更改 Stack 以限制 Swift 的深度

标签 arrays swift

Apple 在其编程指南中给出了传统弹出和拉取堆栈的示例:

struct Stack<Element> {
    var items = [Element]()
    mutating func push(_ item: Element) {
        items.append(item)
    }
    mutating func pop() -> Element {
        return items.removeLast()
    }
}

我的目的是创建一个结构,用于计算内容的“移动平均值”,同时在代码中添加额外的值 - 对我添加到堆栈中的最后 10 个项目进行平均。

可以修改上面的内容来做到这一点,还是我更好地使用如下所示的新结构:

struct Avg<Element> {
    var items = [Element]()
    mutating func additem(_item: Element) {
       if items.count<10 {
           items.append(item)
       } else {
           for i in (1...10).reversed() {
               items[i] = items[i-1]
           }
           items[0]=item
       }
   }
// more functions
}

最佳答案

items.remove(at: 0)items.removeFirst() 会更高效 比你的循环删除第一个数组元素。

但我实际上要做的是使用内部数组作为“环形缓冲区”并覆盖 一旦达到窗口大小,元素就不再移动 所有元素。像这样的事情:

struct Avg<Element> {
    let windowSize: Int
    var totalCount: Int
    var items: [Element]

    init(windowSize: Int) {
        self.windowSize = windowSize
        self.totalCount = 0
        self.items = []
    }

    mutating func additem(_ newItem: Element) {
        if items.count < windowSize {
            items.append(newItem)
        } else {
            items[totalCount % windowSize] = newItem
        }
        totalCount += 1
    }

    // more functions
}

关于arrays - 更改 Stack 以限制 Swift 的深度,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48187719/

相关文章:

php - Postgres 多数组

javascript - 需要了解 Javascript Array.sort() 函数

Java - 如何使用类名和方法名作为字符串从另一个类调用方法

ios - 协议(protocol)中的静态变量

ios - 重新加载单元格时 Tableview 单元格闪烁和位置更改

javascript - jQuery 中的 Array.find 方法替代方法?

javascript - 如何使用自定义方法取消移位/移位单个值和多个值?

ios - 如何传递与 UITapGestureRecognizer 关联的对象

swift - 将 guard 与非可选值赋值一起使用

ios - 在 Combine 中处理发布者错误的最佳实践是什么? (从 CoreLocation 发布航向更新)