如何在Swift中获取两个给定索引之间数组中的平均值

时间:2019-04-10 16:48:11

标签: arrays swift

我正在尝试获取数组中两个索引之间的平均值。我首先想到的解决方案是在将值的总和除以值的数量之前,将数组减小到所需的范围。简化版本如下:

let array = [0, 2, 4, 6, 8, 10, 12]
// The aim is to take the average of the values between array[n] and array[.count - 1].

我尝试使用以下代码:

 func avgOf(x: Int) throws -> String {

let avgforx = solveList.count - x

// Error handling to check if x in average of x does not overstep bounds      
        guard avgforx > 0 else {
            throw FuncError.avgNotPossible
        }

solveList.removeSubrange(ClosedRange(uncheckedBounds: (lower: 0, upper: avgforx - 1)))
        let avgx = (solveList.reduce(0, +)) / Double(x)

// Rounding
        let roundedAvgOfX = (avgx * 1000).rounded() / 1000
        print(roundedAvgOfX)
        return "\(roundedAvgOfX)"
    }

其中avgforx用于表示下界:

array[(.count - 1) - x])

guard语句确保如果索引超出范围,则错误将得到正确处理。

solveList.removeSubrange是我的最初解决方案,因为它删除了所需索引范围之外的值(并随后提供了所需结果),但是事实证明这是有问题的,因为不应保留平均值中未包含的值。 removeSubrange中的行基本上采用了所需的索引字段(例如,array [5]至array [10]),将所有值从array [0]除去为array [4],然后将结果数组的总和除以元素数量。 相反,应该保留array [0]到array [4]中的值。

我将不胜感激。

(Swift 4,Xcode 10)

1 个答案:

答案 0 :(得分:2)

除了修改原始数组的事实外,代码中的错误是,它将剩余元素的总和除以已删除元素的数量(x),而不是除以其余元素。

更好的方法可能是定义一个函数,该函数计算整数集合的平均值:

func average<C: Collection>(of c: C) -> Double where C.Element == Int {
    precondition(!c.isEmpty, "Cannot compute average of empty collection")
    return Double(c.reduce(0, +))/Double(c.count)
}

现在,您可以将其与切片一起使用,而无需修改原始数组:

let array = [0, 2, 4, 6, 8, 10, 12]
let avg1 = average(of: array[3...])  // Average from index 3 to the end
let avg2 = average(of: array[2...4]) // Average from index 2 to 4
let avg3 = average(of: array[..<5])  // Average of first 5 elements