获得数组

时间:2017-06-09 05:56:48

标签: arrays swift swift3 median

我有一个如下所示的数组:

let arr = [1,2,3,4,5,6,7,8,9]

我知道您可以通过以下方式获取minmax

let min = arr.min()
let max = arr.max()

但你怎么得到中位数?

4 个答案:

答案 0 :(得分:6)

要获得median,您可以使用以下内容:

let median = arr.sorted(by: <)[arr.count / 2]

在您的情况下,它将返回5

@Nirav指出[1,2,3,4,5,6,7,8]将返回5,但应返回4.5

请改用:

func calculateMedian(array: [Int]) -> Float {
    let sorted = array.sorted()
    if sorted.count % 2 == 0 {
        return Float((sorted[(sorted.count / 2)] + sorted[(sorted.count / 2) - 1])) / 2
    } else {
        return Float(sorted[(sorted.count - 1) / 2])
    }
}

用法:

let array = [1,2,3,4,5,6,7,8]
let m2 = calculateMedian(array: array) // 4.5

答案 1 :(得分:6)

中位数定义为序列中间的数字。如果没有一个中间数,则它是两个中间数的平均值。

extension Array where Element == Int {
    func median() -> Double {
        let sortedArray = sorted()
        if count % 2 != 0 {
            return Double(sortedArray[count / 2])
        } else {
            return Double(sortedArray[count / 2] + sortedArray[count / 2 - 1]) / 2.0
        }
    }
}

答案 2 :(得分:1)

请注意,如果数组为空,则中位数是不确定的。因此,安全的中值函数会返回一个可选参数,就像min()max()内置方法一样。

extension Array where Element == Int {
    func median() -> Double? {
        guard count > 0  else { return nil }

        let sortedArray = self.sorted()
        if count % 2 != 0 {
            return Double(sortedArray[count/2])
        } else {
            return Double(sortedArray[count/2] + sortedArray[count/2 - 1]) / 2.0
        }
    }
}

定义后,您可以编写:

if let median = arr.median() {
    // do something
}

答案 3 :(得分:0)

如果有人(像我一样)喜欢两个*-liners:

let sorted = arr.sorted(by: <)
let median = Double(sorted[arr.count/2] + sorted.reversed()[arr.count/2])/2.0