美文网首页
iOS 求期望方法重构

iOS 求期望方法重构

作者: SoaringHeart | 来源:发表于2021-04-15 19:45 被阅读0次
Swift 🌰🌰:
        let list = ["-90", "-90", "-90", "-88", "-88",
                    "-88", "-88", "-88", "-60", "-60",
                    "-60", "-60", "-60", "-60", "-90",
                    "-90", "-90", "-90", "-89", "-89",
                    "-89", "-89", "-89", "-89", "-89",
                    "-89", "-60", "-91", "-91", "-91"];
        let value = list.map { CGFloat(Float($0)!) }.expectationValue

//2021-04-15 19:40:03.777000+0800 NSArray+Helper.swift.expectationValue[line 65]: 数组:[-90.0, -90.0, -90.0, -88.0, -88.0, -88.0, -88.0, -88.0, -60.0, -60.0, -60.0, -60.0, -60.0, -60.0, -90.0, -90.0, -90.0, -90.0, -89.0, -89.0, -89.0, -89.0, -89.0, -89.0, -89.0, -89.0, -60.0, -91.0, -91.0, -91.0]
//各元素出现次数: [-60.0: 7, -90.0: 7, -91.0: 3, -88.0: 5, -89.0: 8]
//各元素出现概率: [-89.0: 0.21291866028708134, -88.0: 0.21052631578947367, -90.0: 0.215311004784689, -60.0: 0.14354066985645933, -91.0: 0.21770334928229665]
//总和: -418.0
//期望值是: -85.27751196172248
OC 🌰🌰:
    NSArray *list = @[@"90", @"90", @"90", @"88", @"88",
                      @"88", @"88", @"88", @"60", @"60",
                      @"60", @"60", @"60", @"60", @"90",
                      @"90", @"90", @"90", @"89", @"89",
                      @"89", @"89", @"89", @"89", @"89",
                      @"89", @"60", @"91", @"91", @"91"];
    [self expectationValue:list];

//2021-04-15 19:40:03.733000+0800 NSArray+Helper.swift.expectationValue[line 65]: 数组:[90.0, 90.0, 90.0, 88.0, 88.0, 88.0, 88.0, 88.0, 60.0, 60.0, 60.0, 60.0, 60.0, 60.0, 90.0, 90.0, 90.0, 90.0, 89.0, 89.0, 89.0, 89.0, 89.0, 89.0, 89.0, 89.0, 60.0, 91.0, 91.0, 91.0]
//各元素出现次数: [90.0: 7, 60.0: 7, 91.0: 3, 89.0: 8, 88.0: 5]
//各元素出现概率: [90.0: 0.215311004784689, 60.0: 0.14354066985645933, 89.0: 0.21291866028708134, 88.0: 0.21052631578947367, 91.0: 0.21770334928229665]
//总和: 418.0
//期望值是: 85.27751196172248
public extension Array where Element == CGFloat{

    ///获取数组期望值
    var expectationValue: CGFloat {
        var dic = [CGFloat : Int]()
        let set = Set(self)
        
        for value in set {
            let filterArray = self.filter { $0 == value }
            dic[value] = filterArray.count
        }
//        DDLog(dic)
        
        let sum = dic.keys.map { $0 }.reduce(0, +)
//        DDLog(sum)
        
        var percentDic = [CGFloat: CGFloat]()
        set.forEach { (obj) in
            percentDic[obj] = CGFloat(obj/sum)
        }
//        DDLog(percentDic)
        
        var expectation: CGFloat = 0.0
        percentDic.forEach { (key: CGFloat, value: CGFloat) in
            expectation += key * value
        }
        DDLog("数组:\(self)\n各元素出现次数: \(dic)\n各元素出现概率: \(percentDic)\n总和: \(sum)\n期望值是: \(expectation)")
        return expectation
    }
}


@objc public extension NSArray{

    ///获取数组期望值
    var expectationValue: CGFloat {
        if self.count == 0 {
            return 0.0
        }
        
        if let list = self as? [NSNumber] {
            let array = list.map({ CGFloat($0.floatValue) })
            return array.expectationValue
        }
        
        if let list = self as? [NSString] {
            let array = list.map({ CGFloat($0.floatValue) })
            return array.expectationValue
        }
        return 0.0
    }
    
}

相关文章

网友评论

      本文标题:iOS 求期望方法重构

      本文链接:https://www.haomeiwen.com/subject/vtjjlltx.html