HashSet::insert în Rust

insert adaugă o valoare (true dacă era nouă), contains verifică dacă există, remove o scoate (true dacă exista).

Sintaxă
pub fn insert(&mut self, value: T) -> bool
pub fn contains<Q>(&self, value: &Q) -> bool
pub fn remove<Q>(&mut self, value: &Q) -> bool

Ce face HashSet::insert

insert(x) adaugă x și returnează true dacă valoarea nu exista, respectiv false dacă exista deja (mulțimea rămâne neschimbată). Rezultatul este util pentru detectarea duplicatelor fără o verificare separată.

contains(&x) răspunde dacă valoarea este în mulțime. remove(&x) o scoate și returnează true dacă a existat. Ca la HashMap::get, pentru un HashSet<String> poți căuta și șterge cu un &str.

Parametri

Parametru Descriere
value Valoarea adăugată (prin valoare) sau căutată / ștearsă (prin referință).

Ce returnează

Toate trei returnează bool.

Exemple

Exemplul 1: Prezența la curs

use std::collections::HashSet;

fn main() {
    let mut prezenti = HashSet::new();
    println!("insert Ana: {}", prezenti.insert("Ana"));
    println!("insert Mihai: {}", prezenti.insert("Mihai"));
    println!("insert Ana din nou: {}", prezenti.insert("Ana"));
    println!("Ana prezentă? {}", prezenti.contains("Ana"));
    println!("remove Mihai: {}", prezenti.remove("Mihai"));
    println!("remove Radu: {}", prezenti.remove("Radu"));
    println!("rămân {} persoane", prezenti.len());
}

Rezultat

insert Ana: true
insert Mihai: true
insert Ana din nou: false
Ana prezentă? true
remove Mihai: true
remove Radu: false
rămân 1 persoane

Exemplul 2: Cuvintele importante dintr-o propoziție

Cuvintele de legătură stau într-o mulțime; pentru fiecare cuvânt verificăm forma cu litere mici.

use std::collections::HashSet;

fn main() {
    let de_legatura: HashSet<&str> = ["și", "în", "la", "de", "pe", "cu", "a", "iar"].into_iter().collect();
    let text = "Ana merge la piață cu mama și cumpără mere de la Ion";
    let importante: Vec<&str> = text
        .split_whitespace()
        .filter(|c| !de_legatura.contains(c.to_lowercase().as_str()))
        .collect();
    println!("{:?}", importante);
}

Rezultat

["Ana", "merge", "piață", "mama", "cumpără", "mere", "Ion"]

Greșeli frecvente

  • Faci if !s.contains(&x) { s.insert(x); }: două căutări. insert singur face același lucru și îți spune, prin rezultat, dacă valoarea era nouă.
  • Uiți & la contains pentru numere: s.contains(5) nu compilează; scrie s.contains(&5).

Comenzi înrudite

  • HashSet: O mulțime: ține fiecare valoare o singură dată și răspunde foarte repede dacă o valoare există. Ordinea nu e garantată.
  • HashSet::union: Operațiile cu mulțimi: reuniune (în oricare), intersecție (în ambele), diferență (doar în prima), diferență simetrică (în exact una).
  • Vec::contains: Verifică dacă vectorul conține un element egal cu valoarea dată; parcurge elementele unul câte unul.
  • HashMap::insert: Pune o pereche cheie-valoare în dicționar; dacă cheia exista, înlocuiește valoarea și o returnează pe cea veche.
  • BTreeSet: Mulțime cu elementele mereu sortate: fără duplicate, ca HashSet, dar parcurgerea este în ordine crescătoare.