You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Swift中如何无重复地随机遍历完整字符串列表?

Swift实现无重复随机遍历字符串列表

你的问题在于每次随机选索引时没排除已选元素,导致重复率高。要实现完整无重复的随机遍历,可以通过维护剩余元素/索引列表解决,下面是两种实用方案:

方案一:维护剩余元素列表

这种方式直接操作元素,逻辑直观:

// 保存原始任务列表,保持不变
let originalDares = ["do1", "do2", "do3", "do4", "do5"]
// 跟踪未被选中的任务
var remainingDares: [String] = []

func dareTapped() {
    // 剩余任务为空时,将原始列表打乱后重新填充
    if remainingDares.isEmpty {
        remainingDares = originalDares.shuffled()
    }
    // 取出第一个已打乱的元素,同时从剩余列表移除
    let selectedDare = remainingDares.removeFirst()
    text.text = selectedDare
}

每次点击按钮会从剩余列表取未选中的元素,直到所有元素遍历完毕,再重新打乱原始列表开启新一轮,全程不会重复。

方案二:维护剩余索引列表

如果需要保留原始数组结构,或元素比较复杂,可通过索引间接操作:

let dares = ["do1", "do2", "do3", "do4", "do5"]
// 跟踪未被选中的元素索引
var remainingIndices: [Int] = []

func dareTapped() {
    if remainingIndices.isEmpty {
        // 生成索引数组并打乱
        remainingIndices = Array(0..<dares.count).shuffled()
    }
    // 取出第一个索引,移除后获取对应元素
    let selectedIndex = remainingIndices.removeFirst()
    text.text = dares[selectedIndex]
}

原理和方案一一致,仅通过索引获取元素,适合不想修改原始元素数组的场景。

注意:remainingDares 和 remainingIndices 要定义在类的属性位置(比如ViewController内部),不能放在dareTapped函数里,否则每次调用都会重置,达不到无重复遍历的效果。

内容的提问来源于stack exchange,提问作者andrew

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.02 06:32:35