Menu
Coddy logo textTech

Группировка значений

Часть раздела Логика и управление потоком путешествия по 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: используется только в том случае, если ключ отсутствует, после чего правая часть изменяет запись на месте.

challenge icon

Задание

Средне

Прочитайте одну строку ввода: список слов, разделенных запятыми.

Выведите в следующем порядке:

  1. По одной строке для каждой длины слова, встречающейся во вводе, отсортированной от кратчайшей к самой длинной, в формате <length>: <count>, где count — это количество слов данной длины
  2. 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: подсчитать количество слов по длине; вывести отсортированными; вывести самое частое (при равенстве: более короткое)
quiz iconПроверьте себя

В этом уроке есть небольшой тест. Начните урок, чтобы ответить на вопросы и сохранить прогресс.

Все уроки раздела Логика и управление потоком