Работа с 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 — локальная установка не требуется.