Математическое название того, что вы ищете (самый частый элемент в коллекции), называется mode .Могут быть связи (например, [1, 1, 2, 2, 3, 3]
имеет 3 режима: [1, 2, 3]
)
Если вы хотите какой-либо из режимов (не обращая внимания, какие именно), вы можете использовать Dictionary.max(by:)
, который можно использовать для поиска пары (элемент, количество) с наибольшим количеством (которое является значением dict).Затем вы можете получить ключ этой пары, который будет элементом mode.
extension Sequence where Element: Hashable {
func countOccurrences() -> [Element: Int] {
return self.reduce(into: [:]) { (occurences, element) in occurences[element, default: 0] += 1}
}
func mode() -> Element? {
return self.countOccurrences()
.max(by: { $0.value < $1.value })?
.key
}
func modes() -> [Element] {
var firstModeNumOccurences: Int? = nil
let modes = countOccurrences()
.sorted { pairA, pairB in pairA.value > pairB.value } // sorting in descending order of num occurences
.lazy
.prefix(while:) { (_, numOccurences) in
if firstModeNumOccurences == nil { firstModeNumOccurences = numOccurences }
return numOccurences == firstModeNumOccurences
}
.map { (element, _) in element }
return Array(modes)
}
}
print([1, 2, 3, 3, 4, 4].mode() as Any) // => 3 or 4, non-deterministic
print([1, 2, 3, 3, 4, 4].modes() as Any) // => [3, 4]