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
相关产品推荐
相关产品推荐

