Swift - 从一个数组中随机获取一个、或多个元素(附样例)
作者:hangge | 2018-09-26 08:10
在日常开发中,我们有时需要从一个指定数组中抽取随机元素(或者说样本元素)。比如从一个文章列表数组中随机展示一篇文章,又或是从一个颜色数组中随机获取几个颜色......下面通过样例演示如何实现这个功能。
(2)运行结果如下:
1,扩展 Array
为了方便使用,我们首先对数组(Array)进行扩展(Array+.swift),增加如下两个属性和方法:
- sample:从当前数组中返回一个随机元素
- sample(size, noRepeat):从当前数组中从返回指定个数的随机元素
import Foundation
extension Array {
/// 从数组中返回一个随机元素
public var sample: Element? {
//如果数组为空,则返回nil
guard count > 0 else { return nil }
let randomIndex = Int(arc4random_uniform(UInt32(count)))
return self[randomIndex]
}
/// 从数组中从返回指定个数的元素
///
/// - Parameters:
/// - size: 希望返回的元素个数
/// - noRepeat: 返回的元素是否不可以重复(默认为false,可以重复)
public func sample(size: Int, noRepeat: Bool = false) -> [Element]? {
//如果数组为空,则返回nil
guard !isEmpty else { return nil }
var sampleElements: [Element] = []
//返回的元素可以重复的情况
if !noRepeat {
for _ in 0..<size {
sampleElements.append(sample!)
}
}
//返回的元素不可以重复的情况
else{
//先复制一个新数组
var copy = self.map { $0 }
for _ in 0..<size {
//当元素不能重复时,最多只能返回原数组个数的元素
if copy.isEmpty { break }
let randomIndex = Int(arc4random_uniform(UInt32(copy.count)))
let element = copy[randomIndex]
sampleElements.append(element)
//每取出一个元素则将其从复制出来的新数组中移除
copy.remove(at: randomIndex)
}
}
return sampleElements
}
}
2,使用样例
(1)样例代码
import UIKit
class ViewController: UIViewController{
override func viewDidLoad() {
super.viewDidLoad()
let arr = [1, 2, 3, 4, 5]
print("原始数组:", arr)
print("\n--- 随机获取1个元素 --")
print("第1次:\(arr.sample!)")
print("第2次:\(arr.sample!)")
print("第3次:\(arr.sample!)")
print("第4次:\(arr.sample!)")
print("第5次:\(arr.sample!)")
print("\n--- 随机获取3个元素(可以重复) --")
print("第1次:\(arr.sample(size: 3)!)")
print("第2次:\(arr.sample(size: 3)!)")
print("第3次:\(arr.sample(size: 3)!)")
print("第4次:\(arr.sample(size: 3)!)")
print("第5次:\(arr.sample(size: 3)!)")
print("\n--- 随机获取3个元素(不可以重复) --")
print("第1次:\(arr.sample(size: 3, noRepeat: true)!)")
print("第2次:\(arr.sample(size: 3, noRepeat: true)!)")
print("第3次:\(arr.sample(size: 3, noRepeat: true)!)")
print("第4次:\(arr.sample(size: 3, noRepeat: true)!)")
print("第5次:\(arr.sample(size: 3, noRepeat: true)!)")
}
}
(2)运行结果如下:
全部评论(1)
一直看你的文章,这么长时间都能坚持更新,太厉害了
站长回复:谢谢你的夸奖。我会坚持更新下去的,欢迎常来看看。