生成包含一个属性的加权平均值和另一个属性的总和的对象

问题描述 投票:2回答:1

我有一个包含价值变化信息的类 - 即特定事物在特定时间范围内的价值变化的数量和百分比。

这个类看起来像这样:

@objc internal final class ValueChange: NSObject {

    // MARK: - Internal Properties

    internal let timeframe: Timeframe
    internal let value: NSDecimalNumber
    internal let percentage: NSDecimalNumber
}

我需要一种方法来计算这些对象的多个加权平均值。更具体地说,我需要一个函数,它接受一个ValueChanges数组并将值属性加在一起。应该对value属性进行平均,同时考虑value属性(作为权重)。

例如,以下加权平均值:

ValueChange(timeframe: .day, value: 10.0, percentage: 2.5)
ValueChange(timeframe: .day, value: 20.0, percentage: 5.0)

会产生:

ValueChange(timeframe: .day, value: 30.0, percentage: 4.16666667)

我看了一下this answer,这表明应该使用zip功能。不幸的是,我现在对它非常不熟悉所以我很难看到它如何与一组对象而不是两个数组一起工作。

任何帮助将非常感激。

swift
1个回答
1
投票

你可以试试这个:

let arrays = [...] // Your ValueChange arrays
let weights:[Double] = arrays.map{ $0.value.doubleValue } // [10, 20]
let percentage:[Double] = arrays.map{ $0.percentage.doubleValue } // [2.5, 5.0]

let percentageResult = zip(percentage, weights).map { $0 * $1 }.reduce(0.0, +) / weights.reduce(0.0, +)
print("test: \(percentageResult)") // Print 4.1666666

zip函数是从2个数组创建一个元组数组(这里创建元组数组([2.5, 5.0], [10, 20]))。所以当你在$0 * $1函数中执行map时,它将导致数组[2.5 * 10, 5.0 * 20]

希望这可以帮助。

© www.soinside.com 2019 - 2024. All rights reserved.