Iterator::partition în Rust

Împarte elementele în două colecții: cele pentru care condiția e adevărată și cele pentru care e falsă.

Sintaxă
fn partition<B, F>(self, f: F) -> (B, B)
where B: Default + Extend<Self::Item>, F: FnMut(&Self::Item) -> bool

Ce face Iterator::partition

partition(|x| cond) parcurge iteratorul o singură dată și returnează un tuplu (adevarate, false). Tipul colecțiilor trebuie precizat, de obicei (Vec<_>, Vec<_>). Ordinea elementelor se păstrează în fiecare parte.

Este mai eficient și mai clar decât două filter-e separate cu condiții opuse. Este un consumator: parcurge iteratorul (sau doar cât are nevoie) și pornește lanțul de adaptoare leneșe din fața lui.

Parametri

Parametru Descriere
f Condiția verificată pe &element.

Ce returnează

Un tuplu cu două colecții de tipul B.

Exemple

Exemplul 1: Pare și impare

fn main() {
    let (pare, impare): (Vec<u32>, Vec<u32>) = (1..=10).partition(|n| n % 2 == 0);
    println!("pare:   {:?}", pare);
    println!("impare: {:?}", impare);
}

Rezultat

pare:   [2, 4, 6, 8, 10]
impare: [1, 3, 5, 7, 9]

Exemplul 2: Admiși și respinși

fn main() {
    let candidati = vec![("Ana", 8.75), ("Mihai", 4.9), ("Ioana", 9.6), ("Radu", 5.0), ("Elena", 3.2)];
    let (admisi, respinsi): (Vec<_>, Vec<_>) = candidati.into_iter().partition(|(_, nota)| *nota >= 5.0);
    println!("admiși:   {:?}", admisi);
    println!("respinși: {:?}", respinsi);
}

Rezultat

admiși:   [("Ana", 8.75), ("Ioana", 9.6), ("Radu", 5.0)]
respinși: [("Mihai", 4.9), ("Elena", 3.2)]

Greșeli frecvente

  • Scrii let (a, b) = it.partition(..); fără tip: type annotations needed. Adaugă : (Vec<_>, Vec<_>).
  • Folosești partition pentru mai mult de două grupe: nu se poate. Pentru grupare după o cheie, folosește un HashMap cu entry().or_default().push().

Comenzi înrudite

  • Iterator::filter: Păstrează doar elementele pentru care condiția dată returnează true; restul sunt sărite.
  • Iterator::unzip: Desparte un iterator de perechi în două colecții: una cu primele elemente, alta cu al doilea element din fiecare pereche.
  • Iterator::collect: Consumă iteratorul și adună valorile într-o colecție: Vec, String, HashMap, HashSet, chiar Result sau Option.
  • HashMap::entry: Caută o cheie o singură dată și îți dă „locul” ei (Entry), ca să inserezi, să citești sau să modifici fără o a doua căutare.