swift 从数组清单中随机选取5个元素,不重复选取元素

ql3eal8s  于 2022-11-21  发布在  Swift
关注(0)|答案(6)|浏览(319)

我目前正在尝试为iOS做一个应用程序,但我无法得到一些简单的代码下来。基本上我需要随机选择5个元素从数组列表中没有重复的元素。我有一个粗略的草案,但它只显示一个元素。
下面是我的代码:

let array1 = ["salmon", "turkey", "salad", "curry", "sushi", "pizza"]

let randomIndex1 = Int(arc4random_uniform(UInt32(array1.count)))

print(array1[randomIndex1])
k7fdbhmy

k7fdbhmy1#

您可以这样做:

let array1 = ["salmon", "turkey", "salad", "curry", "sushi", "pizza", "curry", "sushi", "pizza"]
var resultSet = Set<String>()

while resultSet.count < 5 {
    let randomIndex = Int(arc4random_uniform(UInt32(array1.count)))
    resultSet.insert(array1[randomIndex])
}

let resultArray = Array(resultSet)

print(resultArray)

set只能包含唯一的元素,因此不能多次包含相同的元素。
我创建了一个空的set,然后只要数组包含的元素少于5个(您选择的数字),我就进行迭代并向set添加一个随机元素。
在最后一步中,我们需要将集合转换为数组,以获得所需的数组。

u3r8eeie

u3r8eeie2#

SWIFT 5.1版

这个问题已经得到了回答,但我敢提出一个更简单的解决办法。
如果你把你的数组转换成一个集合,你会得到一个没有特定顺序的唯一项的数组。如果你从这个数组中取5个元素,你会得到同样的结果。
但它只是2行;)
示例:

var exampleArray = ["A","B","C","C","C","D","E","F","G","H"]
let uniqueRandomArraySlice = Array(Set(exampleArray)).prefix(5)

示例打印:

["B", "G", "H", "E", "C"]

唯一的要求是你的对象必须符合Hashable协议,这是大多数标准Swift类型所做的,否则让你自己的类型符合协议通常很简单。
https://developer.apple.com/documentation/swift/hashable

brqmpdu1

brqmpdu13#

如果你不想改变原来的数组,下面的代码会把选中的元素放在数组的末尾,然后把数组的最后一部分作为切片返回。如果你不想改变原来的数组,这是很有用的,优点是它不占用额外的内存,而且你可以在同一个数组上多次调用它。

extension Array {
    mutating func takeRandomly(numberOfElements n: Int) -> ArraySlice<Element> {
        assert(n <= self.count)
        for i in stride(from: self.count - 1, to: self.count - n - 1, by: -1) {
            let randomIndex = Int(arc4random_uniform(UInt32(i + 1)))
            self.swapAt(i, randomIndex)
        }
        return self.suffix(n)
    }
}

示例:

var array = [1,2,3,4]
let a1 = array.takeRandomly(numberOfElements: 2)
let a2 = array.takeRandomly(numberOfElements: 2)
ctzwtxfj

ctzwtxfj4#

我的2:Moe Abdul-Hameed的解在理论上有一个缺点:如果你在每次迭代中滚动相同的randomIndexwhile循环将永远不会退出。
另一种方法是创建原始数组的可变副本,然后排除拾取的项目:

var source = array1
var dest = [String]()
for _ in 1...5 {
    let randomIndex = Int(arc4random_uniform(UInt32(source.count)))
    dest.append(source[randomIndex])
    source.remove(at: randomIndex)
}

print(dest)
rm5edbpk

rm5edbpk5#

var array1 = ["salmon", "turkey", "salad", "curry", "sushi", "pizza"]

while array1.count > 0 {

    // random key from array
    let arrayKey = Int(arc4random_uniform(UInt32(array1.count)))

    // your random number
    let randNum = array1[arrayKey] 

    // make sure the number ins't repeated
    array1.removeAtIndex(arrayKey)
}

通过从数组中删除您选取的值,防止重复的值被选取

yacmzcpb

yacmzcpb6#

swift-algorithms现在包含Sequence的扩展名randomSample

import Algorithm

var array1 = ["salmon", "turkey", "salad", "curry", "sushi", "pizza"]
array1.randomSample(count: 5)

相关问题