BTreeSet în Rust

Mulțime cu elementele mereu sortate: fără duplicate, ca HashSet, dar parcurgerea este în ordine crescătoare.

Sintaxă
use std::collections::BTreeSet;

let mut s: BTreeSet<T> = BTreeSet::new();
pub fn insert(&mut self, value: T) -> bool
pub fn contains<Q>(&self, value: &Q) -> bool

Ce face BTreeSet

BTreeSet<T> este perechea sortată a lui HashSet. insert returnează true pentru o valoare nouă și false pentru una existentă, contains verifică existența, iar union, intersection, difference, is_subset merg la fel, cu rezultate în ordine.

Elementele trebuie să implementeze Ord. Pe lângă operațiile de mulțime, primești și cele bazate pe ordine: first, last, range, pop_first. Este cea mai simplă cale de a obține „valorile distincte, sortate” dintr-o listă: v.into_iter().collect::<BTreeSet<_>>().

Parametri

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

Ce returnează

insert și contains returnează bool.

Exemple

Exemplul 1: Etichete distincte, sortate

use std::collections::BTreeSet;

fn main() {
    let mut etichete = BTreeSet::new();
    for e in ["rust", "web", "linux", "rust", "baze-de-date", "web"] {
        etichete.insert(e);
    }
    println!("{:?}", etichete);
    println!("are linux? {}", etichete.contains("linux"));
    println!("insert rust din nou: {}", etichete.insert("rust"));
    println!("{} etichete", etichete.len());
}

Rezultat

{"baze-de-date", "linux", "rust", "web"}
are linux? true
insert rust din nou: false
4 etichete

Exemplul 2: Operații cu mulțimi, cu rezultat sortat

use std::collections::BTreeSet;

fn main() {
    let a: BTreeSet<u32> = [5, 1, 9, 3, 7].into();
    let b: BTreeSet<u32> = [3, 4, 5, 6].into();
    println!("a = {:?}", a);
    println!("a ∪ b = {:?}", a.union(&b).collect::<Vec<_>>());
    println!("a ∩ b = {:?}", &a & &b);
    println!("a - b = {:?}", a.difference(&b).collect::<Vec<_>>());
}

Rezultat

a = {1, 3, 5, 7, 9}
a ∪ b = [1, 3, 4, 5, 6, 7, 9]
a ∩ b = {3, 5}
a - b = [1, 7, 9]

Exemplul 3: Literele unui nume, distincte și sortate

Literele cu diacritice („ș”, „ț”) au coduri Unicode mai mari, deci apar la final.

use std::collections::BTreeSet;

fn main() {
    let litere: BTreeSet<char> = "Ștefan cel Mare și Țepeș"
        .to_lowercase()
        .chars()
        .filter(|c| c.is_alphabetic())
        .collect();
    println!("{}", litere.iter().collect::<String>());
}

Rezultat

acefilmnprtșț

Greșeli frecvente

  • Te aștepți la ordinea inserării: elementele sunt mereu sortate.
  • Pui f64 într-un BTreeSet: f64 nu implementează Ord. Folosește întregi sau un Vec sortat cu total_cmp.

Comenzi înrudite

  • BTreeSet::range: Parcurge doar elementele dintr-un interval de valori, în ordine; util pentru „următorul după x” sau „toate dintre a și b”.
  • BTreeSet::first: Returnează cel mai mic (first) sau cel mai mare (last) element al mulțimii sortate; None dacă e goală.
  • HashSet: O mulțime: ține fiecare valoare o singură dată și răspunde foarte repede dacă o valoare există. Ordinea nu e garantată.
  • BTreeMap: Dicționar cu cheile mereu sortate: aceleași operații ca HashMap, dar parcurgerea și afișarea sunt în ordinea cheilor.
  • HashSet::union: Operațiile cu mulțimi: reuniune (în oricare), intersecție (în ambele), diferență (doar în prima), diferență simetrică (în exact una).