gpt4 book ai didi

快速组合 : Collect with Sliding window like functionality

转载 作者:行者123 更新时间:2023-12-05 01:31:28 25 4
gpt4 key购买 nike

所以我有这个联合发布者,它说发出整数 - 1,2,3,4,5,6,7,8,9,10,11 ....

这些整数虽然并不总是存在。它们是即时生成并发送给发布者的。

我知道 collect 运算符,当它被称为 .collect(5) 时,它会给我 - [1,2,3,4,5], [6,7,8,9,10], ...

我正在寻找的有点像 buffer 和 collect 组合 - [1,2,3,4,5], [2,3,4,5,6], [3,4,5 ,6,7] ...

有没有不用写自定义运算符的方法呢?如果自定义运算符是可行的方法,您能否为此提供一些指导,我之前没有编写过自定义运算符。我希望示例清楚地说明了我的要求。

谢谢

编辑

这可行,但我不确定这是否是最佳解决方案 -

publisher.zip(
publisher.dropFirst(),
publisher.dropFirst(2))

最佳答案

您可以使用扫描 运算符来实现此效果。 Scan 使您能够累积一个值——在本例中是一个以前值的数组——然后发出它。您只需要删除最初的 N-1 个较小的数组。

为方便起见,您可以创建自定义运算符sliding(window:):

extension Publisher {
func sliding(window: Int) -> AnyPublisher<[Output], Failure> {
if window < 1 { return Empty().eraseToAnyPublisher() }
return self
.scan([], { arr, value in
if arr.count < window {
return arr + [value]
} else {
return arr.dropFirst() + [value]
}
})
.dropFirst(window - 1)
.eraseToAnyPublisher()
}
}

用法是:

[1,2,3,4,5,6,7,8,9,10].publisher
.sliding(window: 5)
.sink { print($0) }

输出将是:

[1, 2, 3, 4, 5]
[2, 3, 4, 5, 6]
[3, 4, 5, 6, 7]
[4, 5, 6, 7, 8]
[5, 6, 7, 8, 9]
[6, 7, 8, 9, 10]

关于快速组合 : Collect with Sliding window like functionality,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66201492/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com