如何在Swift中找到数组的平均值

12

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

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

尽管这些问题看起来很简单和基础,但我不确定如何做。请帮忙一下?


计算总和:https://dev59.com/omAf5IYBdhLWcg3wUBNc。元素数量:http://stackoverflow.com/q/27399616/1187415。计算平均值:https://dev59.com/lV4c5IYBdhLWcg3wHXNS。 - Martin R
3个回答

40

为了举例说明,我将把数组定义为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

3
这会返回四舍五入到最接近的整数还是截断为整数值的平均数? - Benzi
1
{btsdaf} - Massmaker
2
在空数组上使用时要小心,它会返回“-nan”。 - Bilaal Rashid

17

这里有一个扩展程序,它可以计算整型和浮点型(即IntFloatDouble等)的平均值,方法基于@bwcooley的答案。

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

13

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

import Accelerate

let avg = vDSP.mean(yourCollection)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接