正如@rmaddy 已经评论的那样,您可以使用Foundation NSCountedSet,如下所示:
import Foundation // or iOS UIKit or macOS Cocoa
let values = [65.0, 65.0, 65.0, 55.5, 55.5, 30.25, 30.25, 27.5]
let countedSet = NSCountedSet(array: values)
print(countedSet.count(for: 65.0)) // 3
for value in countedSet {
print("Element:", value, "count:", countedSet.count(for: value))
}
Xcode 11 • Swift 5.1
您还可以扩展 NSCountedSet 以返回元组数组或字典:
extension NSCountedSet {
var occurences: [(object: Any, count: Int)] { map { ($0, count(for: $0))} }
var dictionary: [AnyHashable: Int] {
reduce(into: [:]) {
guard let key = $1 as? AnyHashable else { return }
$0[key] = count(for: key)
}
}
}
let values = [65.0, 65.0, 65.0, 55.5, 55.5, 30.25, 30.25, 27.5]
let countedSet = NSCountedSet(array: values)
for (key, value) in countedSet.dictionary {
print("Element:", key, "count:", value)
}
对于 Swift 原生解决方案,我们可以扩展 Sequence,将其元素限制为 Hashable:
extension Sequence where Element: Hashable {
var frequency: [Element: Int] { reduce(into: [:]) { $0[$1, default: 0] += 1 } }
}
let values = [65.0, 65.0, 65.0, 55.5, 55.5, 30.25, 30.25, 27.5]
let frequency = values.frequency
frequency[65] // 3
for (key, value) in frequency {
print("Element:", key, "count:", value)
}
那些会打印出来的
Element: 27.5 count: 1
Element: 30.25 count: 2
Element: 55.5 count: 2
Element: 65 count: 3