0Pricing
Learn Rust Coding · Lekcja

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.

Wszystkie lekcje w tym kursie

  1. Budowanie HashMap
  2. Entry API i wartości domyślne
  3. Praca z HashSet
  4. Zliczanie i grupowanie
← Powrót do Learn Rust Coding