我想写一个扩展,它允许我放入一个数组并从该数组返回一定数量的元素,没有重复的项目。我该怎么办?这是我到目前为止所做的,但并不完美。它不考虑重复,它似乎不是最好的方法。我认为使用一组重复可能是有意义的。
extension Array {
func randomElement(numberOfItems:Int) -> [Element] {
var finalReturn = Array()
for i in 0..<numberOfItems {
finalReturn.append(self[Int(arc4random_uniform(UInt32(self.count)))])
}
return finalReturn
}
}
用法应该是这样的。
let selected = allData.randomElement(numberOfItems: 10)
答案 0 :(得分:0)
这是一种方法:
extension Array {
func randomElements(number: Int) -> [Element] {
guard number > 0 else { return [Element]() }
var remaining = self
var chosen = [Element]()
for _ in 0 ..< number {
guard !remaining.isEmpty else { break }
let randomIndex = Int(arc4random_uniform(UInt32(remaining.count)))
chosen.append(remaining[randomIndex])
remaining.remove(at: randomIndex)
}
return chosen
}
}
样品:
let testArray = [1, 2, 3, 4, 5, 6, 7, 8, 9]
let randomThree = testArray.randomElements(number: 3)
// randomThree is [1, 5, 4]
根据您的使用情况,您可能希望在请求的元素数量大于数组中元素的数量时更改行为。
在上面的示例中,如果是这种情况,我会返回可能的最大元素数(原始数组中的元素数)。或者,您可以给出错误或返回nil。