【问题标题】:Loop over a small array repeatedly to get a larger number of items [duplicate]重复循环一个小数组以获得更多的项目[重复]
【发布时间】:2019-02-20 11:05:33
【问题描述】:

我有一个包含 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 个单元格的表格。

【问题讨论】:

  • 认为我的问题更清楚易懂。

标签: arrays swift


【解决方案1】:

我以前需要这个,并实施(我想说的是)一个非常好的解决方案。 CycleSequence 将任何类型的 Collection 包装成一个新的 inifite Sequence,它发出这些元素,永远循环。然后您可以使用.prefix(n) 获取第一个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")]

【讨论】:

  • 吹毛求疵:它包含任何集合,而不是任何序列。 (这是正确的,因为序列不一定可以重复多次。)
  • @MartinR 啊,是的,不错。出于这个原因,我特别选择了集合,即使很少有序列不支持多次传递(只有 UnfoldSequences,AFAIK)。我还专门将此集合设为允许它是无限的(这在zip与其他东西一起使用时非常有用,它总是完美的长度:)),即使这牺牲了可索引性。例如,您不能通过其他方式溢出索引来使用它来索引。
【解决方案2】:

模运算符% 将成为您的朋友。 我面前没有编译器,总是弄乱范围语法,但下面应该说明这个想法......

for i in 0..<100 {
    let theItem = array[i % array.count]
}

【讨论】:

    【解决方案3】:

    有一个外部 for 循环迭代 100 次,还有一个内部 forEach 循环遍历数组。

    let array = [Int]()
    
    for index in 0..<100 {
        array.forEach { element in
            print(element)
        }
    }
    

    简而言之:迭代一百次。

    【讨论】:

    • 如果你要采用这种方法,懒惰的平面图会更好:(0..&lt;100).lazy.flatMap { _ in array }.forEach { print($0) }
    • 根据问题下方的评论,这不是 OP 想要的。当然,从问题本身来看,这实际上并不清楚。
    猜你喜欢
    • 2012-12-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-06-22
    • 2023-03-02
    • 2012-02-28
    相关资源
    最近更新 更多