Напишите дженерик-функцию mostFrequent с ограничением в духе where и поясните каждое ограничение.
Реализуйте дженерик mostFrequent, возвращающий самый частый элемент массива или nil для пустого массива.
Требования:
- Сигнатура:
func mostFrequent<T: Hashable>(_ xs: [T]) -> T?. - Подсчитайте вхождения словарём, затем верните элемент с наибольшим счётом.
- Поясните, зачем нужны ограничение и опциональный возврат.
func mostFrequent<T: Hashable>(_ xs: [T]) -> T? {
// ваш код здесь
}
Напишите реализацию.
func mostFrequent<T: Hashable>(_ xs: [T]) -> T? — ограничение Hashable позволяет T быть ключом словаря для подсчёта, а T? возвращается, потому что у пустого входа нет моды. Клауза where добавляет ограничения вроде T: Comparable, чтобы разрешать ничьи.
- ✗Убирают ограничение
Hashable, всё ещё используяTкак ключ словаря - ✗Возвращают неопциональный
T, хотя у пустого входа нет моды - ✗Думают, что клауза
whereнезаконна на свободной функции
- →Почему использование
Tкак ключа словаря требуетT: Hashable? - →Как
T: Comparableпомог бы разрешить ничью по частоте?
Подсчитайте в словарь, затем возьмите ключ с наибольшим счётом:
func mostFrequent<T: Hashable>(_ xs: [T]) -> T? {
var counts: [T: Int] = [:]
for x in xs { counts[x, default: 0] += 1 }
return counts.max { $0.value < $1.value }?.key
}
T: Hashable нужен, потому что T используется как ключ словаря, а словари хешируют ключи. Возврат T?, потому что у пустого массива нет самого частого элемента — max(by:) возвращает опциональную пару, а ?.key пробрасывает nil. Добавление where T: Comparable позволило бы детерминированно разрешать ничьи вместо выбора произвольного победителя.