簡體   English   中英

如何在Swift中獲取兩個給定索引之間數組中的平均值

[英]How to get average of values in array between two given indexes in 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語句確保如果索引超出范圍,則可以正確處理錯誤。

resolveList.removeSubrange是我的最初解決方案,因為它刪除了所需索引范圍之外的值(並隨后提供了所需結果),但是事實證明這是有問題的,因為不應保留平均值中的值。 removeSubrange中的行基本上采用了所需的索引字段(例如,array [5]至array [10]),將所有值從array [0]除去為array [4],然后將結果數組的總和除以元素數量。 相反,應該保留array [0]到array [4]中的值。

我將不勝感激任何幫助。

(迅速4,Xcode 10)

除了修改原始數組這一事實之外,代碼中的錯誤還在於,它將剩余元素的總和除以移除元素的數量( 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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM