Группировка значений
Часть раздела Логика и управление потоком путешествия по Swift на Coddy — урок 16 из 56.
Шаблон default-subscript является основой для двух повседневных фигур.
Счетчик частоты: подсчитайте, сколько раз встречается каждый ключ.
let letters = ["a", "b", "a", "c", "a"]
var counts: [String: Int] = [:]
for letter in letters {
counts[letter, default: 0] += 1
}
// counts == ["a": 3, "b": 1, "c": 1]Группировка (Bucketing): сбор значений по производному ключу:
let words = ["hi", "hello", "yo", "hey"]
var byLength: [Int: [String]] = [:]
for w in words {
byLength[w.count, default: []].append(w)
}
// [2: ["hi", "yo"], 5: ["hello"], 3: ["hey"]]По умолчанию для случая бакетизации используется пустой массив. Значение default: используется только в том случае, если ключ отсутствует, после чего правая часть изменяет запись на месте.
Задание
СреднеПрочитайте одну строку ввода: список слов, разделенных запятыми.
Выведите в следующем порядке:
- По одной строке для каждой длины слова, встречающейся во вводе, отсортированной от кратчайшей к самой длинной, в формате
<length>: <count>, гдеcount— это количество слов данной длины Most common length: <n>, гдеn— это длина с наибольшим количеством вхождений. При равном количестве выбирайте кратчайшую длину.
Для ввода hi,hello,yo,hey,bonjour,bye вывод будет следующим:
2: 2
3: 2
5: 1
7: 1
Most common length: 2(Длины 2 и 3 встречаются по два раза. При равенстве выбирается меньшая, поэтому побеждает 2.)
Шпаргалка
Счетчик частоты – подсчет количества вхождений каждого ключа с использованием default: 0:
var counts: [String: Int] = [:]
for letter in letters {
counts[letter, default: 0] += 1
}Группировка (Bucketing) – группировка значений по производному ключу с использованием default: []:
var byLength: [Int: [String]] = [:]
for w in words {
byLength[w.count, default: []].append(w)
}Значение default: используется только в том случае, если ключ отсутствует; затем результат изменяется на месте.
Попробуйте сами
let words = readLine()!.components(separatedBy: ",")
// TODO: подсчитать количество слов по длине; вывести отсортированными; вывести самое частое (при равенстве: более короткое)
В этом уроке есть небольшой тест. Начните урок, чтобы ответить на вопросы и сохранить прогресс.
Все уроки раздела Логика и управление потоком
1Строки в деталях
Подсчет и индексыРегистр и удаление пробеловПоиск в строкахРазделение и объединениеЗамена подстрокИтоги — Проверка имени пользователя4Множества
Создание множествОбъединение и пересечениеРазность и симметрическая разностьПодмножество и надмножествоИтоги — Фильтр тегов7Проект — Трекер привычек
Обзор проектаОтметить выполнение10Проект — Движок викторины
Обзор проектаЗадаем вопросы2Диапазоны и шаги
Закрытые и полуоткрытыеШагМетоды диапазоновДиапазоны в SwitchИтоги: Сетка календаря3Словари
Объявление словарейБезопасный поискОбновление словарейИтерация по словарямГруппировка значенийИтоги — Инвентарь6Функции высшего порядка, часть 2
compactMapflatMapsorted(by:)Создание конвейеровПовторение — Таблица лидеров