0Pricing
Learn Rust Coding · Урок

Работа с HashSet

Отслеживайте уникальные значения.

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

Что такое HashSet?

HashSet хранит набор уникальных значений. В нём нет дубликатов и ключей — только элементы.

Он отлично подходит для быстрого ответа на один вопрос: «Встречалось ли мне это значение раньше?»

Создание набора

Как и HashMap, HashSet находится в std::collections и требует импорта с помощью use.

Создайте пустой набор с помощью HashSet::new() и объявите его как mut, чтобы добавлять элементы.

use std::collections::HashSet;

fn main() {
    let mut s: HashSet<i32> = HashSet::new();
    s.insert(1);
    s.insert(2);
    println!("size: {}", s.len());
}

Вставка и дубликаты

Метод insert возвращает значение типа bool: true, если значение было новым, и false, если оно уже присутствовало.

Вставка дубликата ничего не делает, поэтому набор автоматически сохраняет уникальность.

use std::collections::HashSet;

fn main() {
    let mut s = HashSet::new();
    println!("{}", s.insert(5));
    println!("{}", s.insert(5));
    println!("len = {}", s.len());
}

Проверка наличия

Используйте contains, чтобы проверить, есть ли значение в наборе. Метод возвращает значение типа bool.

Именно для этого чаще всего и выбирают набор: поиск получается быстрым и понятным.

use std::collections::HashSet;

fn main() {
    let mut s = HashSet::new();
    s.insert("red");
    s.insert("blue");
    println!("has red? {}", s.contains("red"));
    println!("has green? {}", s.contains("green"));
}

Удаление элементов

Метод remove принимает значение и возвращает true, если оно присутствовало и было удалено.

Попытка удалить отсутствующий элемент просто возвращает false.

use std::collections::HashSet;

fn main() {
    let mut s = HashSet::new();
    s.insert(7);
    println!("{}", s.remove(&7));
    println!("{}", s.remove(&7));
}

Создание из итератора

Любой итератор значений можно напрямую собрать в HashSet.

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

use std::collections::HashSet;

fn main() {
    let nums = [1, 2, 2, 3, 3, 3];
    let unique: HashSet<i32> = nums.iter().copied().collect();
    println!("distinct: {}", unique.len());
}

Перебор набора

Перебирайте набор с помощью цикла for, чтобы посетить каждый его элемент.

Как и для HashMap, порядок перебора не гарантируется и может отличаться при каждом запуске.

use std::collections::HashSet;

fn main() {
    let s: HashSet<i32> = [10, 20, 30].into_iter().collect();
    let mut total = 0;
    for v in &s {
        total += v;
    }
    println!("sum = {}", total);
}

Объединение

Метод union возвращает все значения, которые входят хотя бы в один из двух наборов.

Он возвращает итератор, поэтому его можно собрать в новый набор или перебрать в цикле.

use std::collections::HashSet;

fn main() {
    let a: HashSet<i32> = [1, 2, 3].into_iter().collect();
    let b: HashSet<i32> = [3, 4].into_iter().collect();
    let u: HashSet<i32> = a.union(&b).copied().collect();
    println!("union size: {}", u.len());
}

Пересечение

Метод intersection возвращает значения, найденные в обоих наборах.

Он отлично подходит для поиска общих элементов, например общих меток или общих друзей.

use std::collections::HashSet;

fn main() {
    let a: HashSet<i32> = [1, 2, 3].into_iter().collect();
    let b: HashSet<i32> = [2, 3, 4].into_iter().collect();
    let common: Vec<i32> = a.intersection(&b).copied().collect();
    println!("common count: {}", common.len());
}

Разность

Метод difference возвращает значения, которые есть в первом наборе, но отсутствуют во втором.

Измените порядок наборов, чтобы получить противоположную разность. Для элементов, входящих ровно в один набор, также существует symmetric_difference.

use std::collections::HashSet;

fn main() {
    let a: HashSet<i32> = [1, 2, 3].into_iter().collect();
    let b: HashSet<i32> = [2].into_iter().collect();
    let only_a: Vec<i32> = a.difference(&b).copied().collect();
    println!("only in a: {}", only_a.len());
}

Подмножество и непересекающиеся наборы

Используйте is_subset, чтобы проверить, входит ли каждый элемент одного набора в другой.

Используйте is_disjoint, чтобы проверить, нет ли у двух наборов общих значений. Оба метода возвращают обычное значение типа bool.

use std::collections::HashSet;

fn main() {
    let a: HashSet<i32> = [1, 2].into_iter().collect();
    let b: HashSet<i32> = [1, 2, 3].into_iter().collect();
    println!("a subset of b? {}", a.is_subset(&b));
}

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

Вы дважды вставляете одно и то же значение в HashSet.

Повторение

HashSet хранит уникальные значения и обеспечивает быстрые проверки с помощью contains.

Вы вставляли и удаляли элементы, удаляли дубликаты с помощью collect и объединяли наборы с помощью union, intersection и difference.

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

Урок «Работа с HashSet» бесплатный?

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

Чему я научусь в уроке «Работа с HashSet»?

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

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

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

Сколько времени занимает урок «Работа с HashSet»?

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

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

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

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

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