arrays - 重复循环一个小数组以获得更多的项目
问题描述
我有一个包含 5 个对象的数组。但我想对其进行迭代,以便最终得到 100 个对象。如何,一旦我到达数组索引的末尾,我可以返回并从 0 开始,直到达到 100 次迭代?
假设我的数组是["a", "b", "c", "d", "e"]
,那么我想要的结果是:
0=a 1=b 2=c 3=d 4=e 5=a 6=b 7=c 8=d 9=e 10=a
等等。
我想通过重复此列表中的项目来填充一个包含 100 个单元格的表格。
解决方案
我以前需要这个,并实施(我想说的是)一个非常好的解决方案。CycleSequence
将任何类型的 包装Collection
成一个新的 inifite Sequence
,它发出这些元素,永远循环。然后,您可以使用以下元素获取第一个n
元素.prefix(n)
:
struct CycleSequence<C: Collection>: Sequence {
let cycledElements: C
init(cycling cycledElements: C) {
self.cycledElements = cycledElements
}
public func makeIterator() -> CycleIterator<C> {
return CycleIterator(cycling: cycledElements)
}
}
struct CycleIterator<C: Collection>: IteratorProtocol {
let cycledElements: C
var cycledElementIterator: C.Iterator
init(cycling cycledElements: C) {
self.cycledElements = cycledElements
self.cycledElementIterator = cycledElements.makeIterator()
}
public mutating func next() -> C.Iterator.Element? {
if let next = cycledElementIterator.next() {
return next
} else {
self.cycledElementIterator = cycledElements.makeIterator() // Cycle back again
return cycledElementIterator.next()
}
}
}
print(Array(CycleSequence(cycling: [true, false]).prefix(7)))
print(Array(CycleSequence(cycling: 1...3).prefix(7)))
print(Array(CycleSequence(cycling: "ABC").prefix(7)))
print(Array(CycleSequence(cycling: EmptyCollection<Int>()).prefix(7)))
print(Array(zip(1...10, CycleSequence(cycling: "ABC"))))
输出:
[true, false, true, false, true, false, true]
[1, 2, 3, 1, 2, 3, 1]
["A", "B", "C", "A", "B", "C", "A"]
[]
[(1, "A"), (2, "B"), (3, "C"), (4, "A"), (5, "B"), (6, "C"), (7, "A"), (8, "B"), (9, "C"), (10, "A")]
推荐阅读
- email - 为什么在 ARC 检查转发的电子邮件后,DMARC auth_results 仍然报告 dkim 失败?
- python - 管理员 Django Rest Framework (DRF) 中的 Python/Django 'OperationalError'
- python-3.x - 如何使用 python 3.9.6 运行 anaconda 并启动 jupyter notebook?
- django-crispy-forms - 如何以脆的形式使所有字段一起只读(而不是一个一个)?
- ethereum - 多行上的 Solidity 长字符串常量
- swift - swift中的invalidateFlowLayoutDelegateMetrics与invalidateFlowLayoutAttributes有什么区别?
- reactjs - 延迟后反应日志最终状态值
- javascript - 在为每个数组元素循环数组时如何重新启动settimeout
- laravel - Lumen Artisan 命令在测试时抛出“错误:调用 int 上的成员函数 assertExitCode()”
- java - 更改 Activiti 表名的默认名称