返回 导航

Swift

hangge.com

Swift - 从一个数组中随机获取一个、或多个元素(附样例)

作者:hangge | 2018-09-26 08:10
    在日常开发中,我们有时需要从一个指定数组中抽取随机元素(或者说样本元素)。比如从一个文章列表数组中随机展示一篇文章,又或是从一个颜色数组中随机获取几个颜色......下面通过样例演示如何实现这个功能。

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)

回到顶部