Praca z HashSet
Będzie Pan/Pani śledzić unikatowe wartości.
Praca z HashSet to bezpłatna lekcja Learn Rust Coding na CoddyKit. To lekcja 3 z 4. Możesz przeczytać całą lekcję poniżej za darmo — a potem ćwiczyć ją interaktywnie w przeglądarce z wbudowanym edytorem kodu i tutorem AI dostępnym 24/7. To część ścieżki edukacyjnej Learn Rust Coding, a Twój postęp synchronizuje się między webem a aplikacją CoddyKit. Kurs Learn Rust Coding zawiera 4 lekcji w sumie.
Czym jest HashSet?
HashSet przechowuje kolekcję unikatowych wartości. Nie ma w nim duplikatów ani kluczy — są tylko elementy.
Świetnie nadaje się do szybkiego uzyskania odpowiedzi na pytanie: "czy ta wartość już się pojawiła?"
Tworzenie zbioru
Podobnie jak HashMap, HashSet znajduje się w std::collections i wymaga importu za pomocą use.
Utwórz pusty zbiór za pomocą HashSet::new() i zadeklaruj go jako mut, aby móc dodawać elementy.
use std::collections::HashSet;
fn main() {
let mut s: HashSet<i32> = HashSet::new();
s.insert(1);
s.insert(2);
println!("size: {}", s.len());
}Wstawianie i duplikaty
Metoda insert zwraca wartość typu bool: true, jeśli wartość była nowa, lub false, jeśli już istniała.
Wstawienie duplikatu niczego nie zmienia, więc zbiór automatycznie zachowuje unikatowość elementów.
use std::collections::HashSet;
fn main() {
let mut s = HashSet::new();
println!("{}", s.insert(5));
println!("{}", s.insert(5));
println!("len = {}", s.len());
}Sprawdzanie przynależności
Użyj contains, aby sprawdzić, czy wartość znajduje się w zbiorze. Metoda zwraca wartość typu bool.
To najczęstszy powód wyboru zbioru: szybkie i czytelne wyszukiwanie.
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"));
}Usuwanie elementów
Metoda remove przyjmuje wartość i zwraca true, jeśli ta wartość była obecna i została usunięta.
Usunięcie elementu, którego nie ma w zbiorze, po prostu zwraca false.
use std::collections::HashSet;
fn main() {
let mut s = HashSet::new();
s.insert(7);
println!("{}", s.remove(&7));
println!("{}", s.remove(&7));
}Tworzenie na podstawie iteratora
Dowolny iterator wartości można bezpośrednio zebrać do HashSet.
To szybki sposób na usunięcie duplikatów: przekaż listę z powtórzeniami, a zbiór zachowa każdą wartość tylko raz.
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());
}Iterowanie po zbiorze
Użyj pętli for na zbiorze, aby odwiedzić każdy jego element.
Podobnie jak w przypadku HashMap, kolejność iterowania nie jest gwarantowana i może różnić się przy każdym uruchomieniu.
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);
}Suma
Metoda union zwraca każdą wartość, która znajduje się w którymkolwiek z obu zbiorów.
Zwraca iterator, dlatego należy zebrać jego elementy do nowego zbioru albo przeiterować po nim w pętli.
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());
}Część wspólna
Metoda intersection zwraca wartości występujące w obu zbiorach.
Doskonale nadaje się do znajdowania wspólnych elementów, takich jak wspólne tagi lub wspólni znajomi.
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());
}Różnica
Metoda difference zwraca wartości znajdujące się w pierwszym zbiorze, ale nie w drugim.
Zamień kolejność zbiorów, aby uzyskać różnicę w drugą stronę. Dostępna jest także metoda symmetric_difference, która zwraca elementy należące dokładnie do jednego zbioru.
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());
}Podzbiór i rozłączność
Użyj is_subset, aby sprawdzić, czy każdy element jednego zbioru znajduje się w innym zbiorze.
Użyj is_disjoint, aby sprawdzić, czy dwa zbiory nie mają żadnych wspólnych wartości. Obie metody zwracają zwykłą wartość 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));
}Szybkie sprawdzenie
Wstawiasz tę samą wartość do HashSet dwa razy.
Podsumowanie
HashSet przechowuje unikatowe wartości i umożliwia szybkie sprawdzanie za pomocą contains.
Wstawiasz i usuwasz elementy, usuwasz duplikaty za pomocą collect, a także łączysz zbiory przy użyciu metod union, intersection i difference.
Często zadawane pytania
Czy lekcja „Praca z HashSet” jest bezpłatna?
Tak — pełny tekst „Praca z HashSet” jest dostępny za darmo tutaj w sieci. Aby ćwiczyć ją interaktywnie (wbudowany edytor kodu i tutor AI dostępny 24/7) i odblokować resztę kursu Learn Rust Coding, przejdź na CoddyKit PRO. Kurs Learn Rust Coding zawiera 4 lekcji w sumie.
Co nauczysz się w „Praca z HashSet”?
Będzie Pan/Pani śledzić unikatowe wartości. Ćwiczysz Learn Rust Coding z praktycznym kodem, który uruchamiasz bezpośrednio w przeglądarce, a tutor AI dostępny 24/7 odpowiada na Twoje pytania podczas pracy nad lekcją.
Czy potrzebuję doświadczenia, aby zacząć Learn Rust Coding?
Nie wymagamy żadnego doświadczenia. Learn Rust Coding w CoddyKit jest strukturyzowany dla początkujących i zaawansowanych użytkowników, więc możesz zacząć tutaj lub od początku i uczyć się w swoim tempie. To lekcja 3 z 4.
Ile czasu zajmuje lekcja „Praca z HashSet”?
Większość lekcji CoddyKit trwa około 5–10 minut. Każda lekcja to mały, interaktywny krok, dzięki czemu robisz systematyczne postępy i zawsze wracasz dokładnie do tego samego miejsca — na webie i w aplikacji.
Czy mogę pisać i uruchamiać kod w tej lekcji Learn Rust Coding?
Tak. Każda lekcja Learn Rust Coding zawiera wbudowany edytor kodu, więc piszesz i uruchamiasz prawdziwy kod bezpośrednio w przeglądarce i od razu otrzymujesz sprzężenie zwrotne od AI — bez konfiguracji na komputerze.