HashSet::is_subset în Rust

Verifică dacă toate elementele unei mulțimi se află și în alta; is_superset și is_disjoint sunt verificările înrudite.

Sintaxă
pub fn is_subset(&self, other: &HashSet<T, S>) -> bool
pub fn is_superset(&self, other: &HashSet<T, S>) -> bool
pub fn is_disjoint(&self, other: &HashSet<T, S>) -> bool

Ce face HashSet::is_subset

a.is_subset(&b) returnează true dacă fiecare element din a se găsește și în b. O mulțime goală este submulțime a oricărei mulțimi, iar orice mulțime este submulțime a ei însăși.

a.is_superset(&b) este verificarea inversă (b.is_subset(&a)). a.is_disjoint(&b) returnează true dacă cele două nu au niciun element comun.

Parametri

Parametru Descriere
other Mulțimea cu care se compară.

Ce returnează

bool.

Exemple

Exemplul 1: Am toate ingredientele?

use std::collections::HashSet;

fn main() {
    let camara: HashSet<&str> = HashSet::from(["făină", "ouă", "lapte", "zahăr", "ulei"]);
    let clatite: HashSet<&str> = HashSet::from(["făină", "ouă", "lapte"]);
    let cozonac: HashSet<&str> = HashSet::from(["făină", "ouă", "lapte", "drojdie", "nucă"]);

    println!("clătite: {}", clatite.is_subset(&camara));
    println!("cozonac: {}", cozonac.is_subset(&camara));
    println!("cămara le acoperă pe clătite: {}", camara.is_superset(&clatite));

    let mut lipsa: Vec<_> = cozonac.difference(&camara).collect();
    lipsa.sort();
    println!("pentru cozonac lipsesc: {:?}", lipsa);
}

Rezultat

clătite: true
cozonac: false
cămara le acoperă pe clătite: true
pentru cozonac lipsesc: ["drojdie", "nucă"]

Exemplul 2: Ture fără suprapuneri

Două ture sunt compatibile dacă nu au nicio oră comună.

use std::collections::HashSet;

fn main() {
    let dimineata: HashSet<u32> = (8..12).collect();
    let pranz: HashSet<u32> = (11..15).collect();
    let seara: HashSet<u32> = (16..20).collect();
    println!("dimineață + prânz fără suprapunere? {}", dimineata.is_disjoint(&pranz));
    println!("dimineață + seară fără suprapunere? {}", dimineata.is_disjoint(&seara));
    let gol: HashSet<u32> = HashSet::new();
    println!("mulțimea goală e submulțime: {}", gol.is_subset(&seara));
}

Rezultat

dimineață + prânz fără suprapunere? false
dimineață + seară fără suprapunere? true
mulțimea goală e submulțime: true

Greșeli frecvente

  • Inversezi sensul: a.is_subset(&b) întreabă dacă a este conținută în b, nu invers.
  • Calculezi a.intersection(&b).count() == 0 pentru a verifica lipsa elementelor comune. is_disjoint spune același lucru, mai clar.

Comenzi înrudite

  • HashSet::union: Operațiile cu mulțimi: reuniune (în oricare), intersecție (în ambele), diferență (doar în prima), diferență simetrică (în exact una).
  • HashSet: O mulțime: ține fiecare valoare o singură dată și răspunde foarte repede dacă o valoare există. Ordinea nu e garantată.
  • BTreeSet: Mulțime cu elementele mereu sortate: fără duplicate, ca HashSet, dar parcurgerea este în ordine crescătoare.
  • Iterator::any: any verifică dacă măcar un element îndeplinește condiția; all verifică dacă toate o îndeplinesc. Se opresc cât de repede pot.