我有一个如下所示的数组:
let arr = [1,2,3,4,5,6,7,8,9]
我知道您可以通过以下方式获取min
和max
let min = arr.min()
let max = arr.max()
但你怎么得到中位数?
答案 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