从数组中获取一定数量的随机项

时间:2017-11-06 21:07:33

标签: arrays swift

我想写一个扩展,它允许我放入一个数组并从该数组返回一定数量的元素,没有重复的项目。我该怎么办?这是我到目前为止所做的,但并不完美。它不考虑重复,它似乎不是最好的方法。我认为使用一组重复可能是有意义的。

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)

1 个答案:

答案 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。