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
partitionpentru mai mult de două grupe: nu se poate. Pentru grupare după o cheie, folosește unHashMapcuentry().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.