0Pricing
Learn Rust Coding · Урок

Подсчёт и группировка

Распространённые шаблоны на основе отображений.

«Подсчёт и группировка» — бесплатный урок Learn Rust Coding на CoddyKit. Это урок 4 из 4. Ты можешь прочитать весь урок бесплатно ниже — а потом практиковать его прямо в браузере с встроенным редактором кода и ИИ-репетитором 24/7. Это часть пути обучения Learn Rust Coding, и твой прогресс синхронизируется между веб-версией и приложением CoddyKit. Курс Learn Rust Coding содержит 4 уроков всего.

Подсчёт элементов

Очень часто требуется подсчитать, сколько раз каждое значение встречается в коллекции.

Естественный инструмент для этого — HashMap, сопоставляющий значения с количеством их появлений. Ключом является элемент, а значением — его счётчик.

Шаблон подсчёта

Для каждого элемента найдите его ячейку, установите для неё ноль по умолчанию и прибавьте единицу.

API записей позволяет выполнить это в одной понятной строке. Этот шаблон подходит для подсчёта любых элементов.

use std::collections::HashMap;

fn main() {
    let mut counts = HashMap::new();
    for n in [1, 1, 2, 3, 3, 3] {
        *counts.entry(n).or_insert(0) += 1;
    }
    println!("threes: {}", counts[&3]);
}

Подсчёт символов

Строки состоят из символов, поэтому частоту букв можно подсчитывать таким же способом.

Выполняйте перебор с помощью chars() и добавляйте счётчик каждого символа в карту.

use std::collections::HashMap;

fn main() {
    let mut freq = HashMap::new();
    for c in "banana".chars() {
        *freq.entry(c).or_insert(0) += 1;
    }
    println!("a: {}, n: {}", freq[&'a'], freq[&'n']);
}

Подсчёт слов

Чтобы подсчитать слова, разделите предложение по пробельным символам с помощью split_whitespace.

Каждый фрагмент становится ключом. На этом основан простой анализатор частоты слов.

use std::collections::HashMap;

fn main() {
    let text = "go go stop go";
    let mut counts = HashMap::new();
    for w in text.split_whitespace() {
        *counts.entry(w).or_insert(0) += 1;
    }
    println!("go: {}", counts["go"]);
}

Поиск максимального количества

Получив счётчики, найдите самый частый элемент: перебирайте элементы и отслеживайте наибольшее значение.

Можно сравнивать количество в каждой записи с лучшим результатом, найденным на данный момент.

use std::collections::HashMap;

fn main() {
    let mut counts = HashMap::new();
    for c in "aabbbc".chars() {
        *counts.entry(c).or_insert(0) += 1;
    }
    let top = counts.iter().max_by_key(|(_, &v)| v).unwrap();
    println!("most common: {}", top.0);
}

Группировка элементов

Группировка помещает элементы в группы с общим свойством.

Используйте HashMap, сопоставляющий ключ группы с Vec элементов. При первом обращении API записей создаёт пустой вектор по умолчанию.

use std::collections::HashMap;

fn main() {
    let mut groups: HashMap<bool, Vec<i32>> = HashMap::new();
    for n in 1..=6 {
        groups.entry(n % 2 == 0).or_default().push(n);
    }
    println!("evens: {:?}", groups[&true]);
}

Группировка по первой букве

Естественным ключом группировки является первый символ слова.

Извлеките его, а затем добавьте каждое слово в соответствующую группу.

use std::collections::HashMap;

fn main() {
    let words = ["apple", "avocado", "banana"];
    let mut by_letter: HashMap<char, Vec<&str>> = HashMap::new();
    for w in words {
        let first = w.chars().next().unwrap();
        by_letter.entry(first).or_default().push(w);
    }
    println!("a-words: {}", by_letter[&'a'].len());
}

Группировка по длине

Группировать можно по любому вычисляемому свойству, например по длине каждого слова.

В этом случае ключом является число, а в каждой группе собираются слова такой длины.

use std::collections::HashMap;

fn main() {
    let words = ["hi", "yo", "hey", "hello"];
    let mut by_len: HashMap<usize, Vec<&str>> = HashMap::new();
    for w in words {
        by_len.entry(w.len()).or_default().push(w);
    }
    println!("len 2: {}", by_len[&2].len());
}

Подсчёт уникальных элементов

Чтобы подсчитать различные значения, объедините набор с картой. Или просто соберите значения в HashSet и узнайте его длину.

Так можно определить, сколько разных элементов встречается, не учитывая повторы.

use std::collections::HashSet;

fn main() {
    let visits = ["sam", "mia", "sam", "leo", "mia"];
    let unique: HashSet<&str> = visits.iter().copied().collect();
    println!("unique visitors: {}", unique.len());
}

Вывод результатов

После подсчёта или группировки переберите карту, чтобы вывести отчёт.

Помните, что порядок не определён; если нужен стабильный результат, сначала отсортируйте ключи.

use std::collections::HashMap;

fn main() {
    let mut counts = HashMap::new();
    for c in "abca".chars() {
        *counts.entry(c).or_insert(0) += 1;
    }
    let mut keys: Vec<_> = counts.keys().collect();
    keys.sort();
    for k in keys {
        println!("{}: {}", k, counts[k]);
    }
}

Суммирование по группам

Вместо сбора элементов можно вычислять общий результат, например суммировать значения для каждого ключа.

Установите для ячейки ноль по умолчанию и добавляйте значение каждого элемента — так же, как при подсчёте, но с настоящими величинами.

use std::collections::HashMap;

fn main() {
    let sales = [("a", 10), ("b", 5), ("a", 3)];
    let mut totals: HashMap<&str, i32> = HashMap::new();
    for (k, amount) in sales {
        *totals.entry(k).or_insert(0) += amount;
    }
    println!("a total: {}", totals["a"]);
}

Быстрая проверка

Вы хотите распределить слова по группам в зависимости от их первой буквы.

Повторение

С помощью шаблона записей вы подсчитывали элементы, символы и слова, а также находили самое частое значение.

Вы группировали элементы в группы Vec по букве и длине и подсчитывали различные значения с помощью HashSet.

Часто задаваемые вопросы

Урок «Подсчёт и группировка» бесплатный?

Да — полный текст урока «Подсчёт и группировка» бесплатно доступен здесь в веб-версии. Чтобы практиковать его интерактивно (встроенный редактор кода и ИИ-репетитор 24/7) и разблокировать остальной курс Learn Rust Coding, подпишись на CoddyKit PRO. Курс Learn Rust Coding содержит 4 уроков всего.

Чему я научусь в уроке «Подсчёт и группировка»?

Распространённые шаблоны на основе отображений. Ты практикуешь Learn Rust Coding с помощью реального кода, который запускаешь прямо в браузере, и ИИ-репетитор 24/7 отвечает на твои вопросы во время урока.

Нужен ли мне опыт, чтобы начать Learn Rust Coding?

Предыдущий опыт не требуется. Learn Rust Coding на CoddyKit структурирован для всех уровней — от новичков до продвинутых, поэтому ты можешь начать отсюда или с самого начала и учиться в своем темпе. Это урок 4 из 4.

Сколько времени занимает урок «Подсчёт и группировка»?

Большинство уроков CoddyKit занимают около 5–10 минут. Каждый из них компактный и интерактивный, поэтому ты постоянно делаешь прогресс и продолжаешь с того же места в веб-версии и приложении.

Можно ли писать и запускать код в этом уроке Learn Rust Coding?

Да. Каждый урок Learn Rust Coding включает встроенный редактор кода, поэтому ты пишешь и запускаешь реальный код прямо в браузере и получаешь моментальную обратную связь от AI — локальная установка не требуется.

Все уроки этого курса

  1. Создание HashMap
  2. API Entry и значения по умолчанию
  3. Работа с HashSet
  4. Подсчёт и группировка
← Назад к Learn Rust Coding