【问题标题】:How to find the average value of an array - Swift [duplicate]如何找到数组的平均值 - Swift [重复]
【发布时间】:2017-04-30 06:57:59
【问题描述】:

我遇到了一个问题,我不知道如何找到数组的平均值。以下是我的问题:

  1. 如何将数组中的所有数字相加?
  2. 如何找到我的数组中有多少索引?
  3. 如何获取这些信息并从我的数组中收集平均值?

虽然所有这些看起来都很简单且相当初级,但我不确定如何做到这一点。有什么帮助吗?

【问题讨论】:

标签: arrays swift


【解决方案1】:

例如,我将我的数组定义为intArray,并使用[10, 15, 5, 7, 13] 的值创建我们的最终数组:

var intArray = [10, 15, 5, 7, 13]

现在让我们按顺序回答每个问题:

  1. 如何将数组中的所有数字相加?

为了将数组中的所有数字相加,您需要使用数组中集成的reduce() 函数。它看起来像这样:

intArray.reduce(0, +)

此行将获取您的数组,在本例中为 intArray,并从索引号 0 开始减少它,并添加以下所有连续数字。 然而,在我们的例子中,我们需要将此值分配给一个变量,以便稍后在平均函数中使用它。看起来是这样的:

let sumArray = intArray.reduce(0, +)
  1. 如何找到我的数组中有多少索引?

在我们的例子中,我们需要索引的总数来计算除以什么来得到我们的最终平均值。这是通过利用数组的count() 属性来完成的。看起来像这样:

intArray.count

现在我们有了总索引计数,我们可以找出下一个问题的答案。

  1. 如何获取这些信息并从我的数组中收集平均值?

我们可以从问题 1 和问题 2 中获取信息并将它们组合在一起以获得我们的数组的平均值。它看起来像这样:

let avgArrayValue = sumArray / intArray.count

整个代码如下所示:

let sumArray = intArray.reduce(0, +)

let avgArrayValue = sumArray / intArray.count

【讨论】:

  • 这将返回四舍五入到最接近整数的平均值还是截断为整数值?
  • 如果您需要双重结果 - let avgArrayValue = Double(sumArray) / Double(intArray.count)
  • 在空数组上使用它时要小心。它将返回-nan
【解决方案2】:

这是一个扩展,它根据@bwcooley 的回答计算整数和浮点类型(即IntFloatDouble 等)的平均值

extension Array where Element: BinaryInteger {

    /// The average value of all the items in the array
    var average: Double {
        if self.isEmpty {
            return 0.0
        } else {
            let sum = self.reduce(0, +)
            return Double(sum) / Double(self.count)
        }
    }

}

extension Array where Element: BinaryFloatingPoint {

    /// The average value of all the items in the array
    var average: Double {
        if self.isEmpty {
            return 0.0
        } else {
            let sum = self.reduce(0, +)
            return Double(sum) / Double(self.count)
        }
    }

}

用法:

let array = [1,2,3]
array.average // 2.0

【讨论】:

    【解决方案3】:

    为了更快的计算,您可以使用 Accelerate 框架

    import Accelerate
    
    let avg = vDSP.mean(yourCollection)
    

    【讨论】:

      猜你喜欢
      • 2011-07-08
      • 2012-08-24
      • 1970-01-01
      • 2021-04-08
      • 2016-10-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多