开发者社区> 问答> 正文

如何在Swift中对数组进行混洗?

如何在Swift中随机或随机排列数组中的元素?例如,如果我的阵列由52张扑克牌,我想洗牌的阵列,以洗牌。

展开
收起
保持可爱mmm 2020-01-16 14:57:27 544 0
1 条回答
写回答
取消 提交回答
  • 该答案详细说明了如何在Swift 4.2+中使用快速统一的算法(Fisher-Yates)进行改组,以及如何在各个早期版本的Swift中添加相同的功能。每个Swift版本的命名和行为都与该版本的变异和非变异排序方法匹配。

    迅捷4.2+ shuffle并且shuffled是原生的Swift 4.2。用法示例:

    let x = [1, 2, 3].shuffled() // x == [2, 3, 1]

    let fiveStrings = stride(from: 0, through: 100, by: 5).map(String.init).shuffled() // fiveStrings == ["20", "45", "70", "30", ...]

    var numbers = [1, 2, 3, 4] numbers.shuffle() // numbers == [3, 2, 1, 4] Swift 4.0和4.1 这些扩展将shuffle()方法添加到任何可变集合(数组和不安全的可变缓冲区),并shuffled()在任何序列上添加方法:

    extension MutableCollection { /// Shuffles the contents of this collection. mutating func shuffle() { let c = count guard c > 1 else { return }

        for (firstUnshuffled, unshuffledCount) in zip(indices, stride(from: c, to: 1, by: -1)) {
            // Change `Int` in the next line to `IndexDistance` in < Swift 4.1
            let d: Int = numericCast(arc4random_uniform(numericCast(unshuffledCount)))
            let i = index(firstUnshuffled, offsetBy: d)
            swapAt(firstUnshuffled, i)
        }
    }
    

    }

    extension Sequence { /// Returns an array with the contents of this sequence, shuffled. func shuffled() -> [Element] { var result = Array(self) result.shuffle() return result } } 与上述Swift 4.2示例中的用法相同。

    迅捷3 这些扩展将shuffle()方法添加到任何可变集合中,并将shuffled()方法添加到任何序列中:

    extension MutableCollection where Indices.Iterator.Element == Index { /// Shuffles the contents of this collection. mutating func shuffle() { let c = count guard c > 1 else { return }

        for (firstUnshuffled , unshuffledCount) in zip(indices, stride(from: c, to: 1, by: -1)) {
            // Change `Int` in the next line to `IndexDistance` in < Swift 3.2
            let d: Int = numericCast(arc4random_uniform(numericCast(unshuffledCount)))
            guard d != 0 else { continue }
            let i = index(firstUnshuffled, offsetBy: d)
            self.swapAt(firstUnshuffled, i)
        }
    }
    

    }

    extension Sequence { /// Returns an array with the contents of this sequence, shuffled. func shuffled() -> [Iterator.Element] { var result = Array(self) result.shuffle() return result } } 与上述Swift 4.2示例中的用法相同。

    迅捷2 (过时的语言:自2018年7月起,您将无法使用Swift 2.x在iTunes Connect上发布)

    extension MutableCollectionType where Index == Int { /// Shuffle the elements of self in-place. mutating func shuffleInPlace() { // empty and single-element collections don't shuffle if count < 2 { return }

        for i in startIndex ..< endIndex - 1 {
            let j = Int(arc4random_uniform(UInt32(count - i))) + i
            guard i != j else { continue }
            swap(&self[i], &self[j])
        }
    }
    

    }

    extension CollectionType { /// Return a copy of self with its elements shuffled. func shuffle() -> [Generator.Element] { var list = Array(self) list.shuffleInPlace() return list } } 用法:

    [1, 2, 3].shuffle() // [2, 3, 1]

    let fiveStrings = 0.stride(through: 100, by: 5).map(String.init).shuffle() // ["20", "45", "70", "30", ...]

    var numbers = [1, 2, 3, 4] numbers.shuffleInPlace() // [3, 2, 1, 4] 斯威夫特1.2 (过时的语言:自2018年7月起,您将无法使用Swift 1.x在iTunes Connect上发布)

    shuffle 作为变异数组方法 此扩展使您可以Array在适当的位置随机排列一个可变实例:

    extension Array { mutating func shuffle() { if count < 2 { return } for i in 0..<(count - 1) { let j = Int(arc4random_uniform(UInt32(count - i))) + i swap(&self[i], &self[j]) } } } var numbers = [1, 2, 3, 4, 5, 6, 7, 8] numbers.shuffle() // e.g., numbers == [6, 1, 8, 3, 2, 4, 7, 5] shuffled 作为非变异数组方法 通过此扩展,您可以检索Array实例的随机组合副本:

    extension Array { func shuffled() -> [T] { if count < 2 { return self } var list = self for i in 0..<(list.count - 1) { let j = Int(arc4random_uniform(UInt32(list.count - i))) + i swap(&list[i], &list[j]) } return list } } let numbers = [1, 2, 3, 4, 5, 6, 7, 8] let mixedup = numbers.shuffled() // e.g., mixedup == [6, 1, 8, 3, 2, 4, 7, 5] 问题来源于stack overflow

    2020-01-16 15:08:15
    赞同 展开评论 打赏
问答分类:
问答标签:
问答地址:
问答排行榜
最热
最新

相关课程

更多

相关电子书

更多
OpenStack Swift 海量小文件优化之路 立即下载
From Java/Android to Swift iOS 立即下载
Swift在Airbnb的应用实践 立即下载