Vec::dedup în Rust

Șterge elementele egale aflate unul după altul; dedup_by_key compară după o cheie calculată din fiecare element.

Sintaxă
pub fn dedup(&mut self)   // T: PartialEq
pub fn dedup_by_key<K, F>(&mut self, key: F)   // Rust 1.16
where F: FnMut(&mut T) -> K, K: PartialEq

Ce face Vec::dedup

dedup() elimină duplicatele consecutive: dintr-o serie de elemente egale, unul după altul, rămâne doar primul. Dacă aceeași valoare apare din nou mai târziu, după alt element, ea rămâne.

Pentru a elimina toate duplicatele dintr-un vector, sortează-l întâi: v.sort(); v.dedup();. După sortare, toate valorile egale sunt alăturate. Dacă ordinea inițială trebuie păstrată, folosește un HashSet cu elementele deja văzute.

dedup_by_key(f) compară cheile f(element), nu elementele: de exemplu, textul transformat în litere mici, ca „Iași” și „IAȘI” să fie considerate egale. Primul element din fiecare serie este cel păstrat.

Parametri

Parametru Descriere
key La dedup_by_key: closure-ul care calculează cheia de comparat pentru fiecare element.

Ce returnează

Nimic; vectorul este modificat pe loc.

Exemple

Exemplul 1: Doar duplicatele alăturate dispar

În primul vector, al doilea 1 rămâne, pentru că între cei doi de 1 se află alte valori. După sort, toate duplicatele dispar.

fn main() {
    let mut v = vec![1, 1, 2, 3, 3, 3, 1, 4, 4];
    v.dedup();
    println!("dedup:        {:?}", v);

    let mut w = vec![1, 1, 2, 3, 3, 3, 1, 4, 4];
    w.sort();
    w.dedup();
    println!("sort + dedup: {:?}", w);
}

Rezultat

dedup:        [1, 2, 3, 1, 4]
sort + dedup: [1, 2, 3, 4]

Exemplul 2: Ignorarea literelor mari și mici

Cheia este textul cu litere mici. „Iași”, „IAȘI” și „iași” sunt alăturate și egale după cheie, deci rămâne doar primul. Ultimul „Iași” rămâne, pentru că vine după „Cluj”.

fn main() {
    let mut orase = vec!["Iași", "IAȘI", "iași", "Cluj", "cluj", "Iași"];
    orase.dedup_by_key(|o| o.to_lowercase());
    println!("{:?}", orase);
}

Rezultat

["Iași", "Cluj", "Iași"]

Greșeli frecvente

  • Te aștepți ca dedup să elimine toate duplicatele dintr-un vector nesortat. Elimină doar duplicatele alăturate; sortează întâi.
  • Sortezi doar ca să elimini duplicatele, deși ordinea inițială contează. Păstrează ordinea cu un HashSet: v.retain(|x| vazute.insert(*x)).

Comenzi înrudite

  • Vec::sort: Sortează vectorul crescător, pe loc. sort este stabilă (păstrează ordinea elementelor egale); sort_unstable e mai rapidă.
  • Vec::retain: Păstrează în vector doar elementele pentru care funcția dată returnează true; restul sunt șterse, în aceeași ordine.
  • HashSet: O mulțime: ține fiecare valoare o singură dată și răspunde foarte repede dacă o valoare există. Ordinea nu e garantată.
  • Vec::sort_by: Sortează după o regulă proprie: sort_by primește o funcție de comparare, sort_by_key o cheie calculată din element.