Iterator::is_sorted în Rust

Verifică dacă elementele sunt în ordine crescătoare (fiecare cel puțin egal cu cel dinainte).

Sintaxă
fn is_sorted(self) -> bool   // Self::Item: PartialOrd
fn is_sorted_by_key<F, K>(self, f: F) -> bool
fn is_sorted_by<F>(self, compare: F) -> bool

Ce face Iterator::is_sorted

is_sorted() compară elementele vecine și returnează false la prima pereche în care al doilea element este mai mic decât primul. Elementele egale alăturate sunt permise. Un iterator gol sau cu un singur element este sortat.

is_sorted_by_key(|x| cheie) verifică ordinea după o cheie, iar is_sorted_by(|a, b| a <= b) primește regula de comparație (de exemplu a >= b pentru ordine descrescătoare). Aceleași metode există și pe slice-uri: v.is_sorted(). Merge și pe f64, pentru că cere doar PartialOrd.

Ce returnează

bool.

Exemple

Exemplul 1: Crescător, descrescător, după cheie

fn main() {
    println!("{}", [1, 3, 3, 7].iter().is_sorted());
    println!("{}", [1, 7, 3].iter().is_sorted());
    println!("{}", [12.5, 9.0, 3.25].iter().is_sorted_by(|a, b| a >= b));

    let cuvinte = ["a", "doi", "patru", "cinci"];
    println!("după lungime: {}", cuvinte.iter().is_sorted_by_key(|c| c.len()));
    println!("pe slice: {}", vec![2, 4, 8].is_sorted());
}

Rezultat

true
false
true
după lungime: true
pe slice: true

Exemplul 2: Verificare înainte de căutarea binară

fn cauta(v: &[u32], x: u32) -> Result<usize, usize> {
    debug_assert!(v.is_sorted(), "binary_search cere un vector sortat");
    v.binary_search(&x)
}

fn main() {
    let ani = [1859, 1918, 1989, 2007];
    println!("{:?}", cauta(&ani, 1918));
    println!("datele sunt sortate: {}", ani.is_sorted());
}

Rezultat

Ok(1)
datele sunt sortate: true

Greșeli frecvente

  • Te aștepți ca is_sorted să verifice ordinea descrescătoare: verifică doar crescător. Pentru descrescător: is_sorted_by(|a, b| a >= b).
  • Sortezi doar ca să verifici dacă datele erau deja sortate: is_sorted nu modifică nimic și face o singură trecere.

Comenzi înrudite

  • Vec::sort: Sortează vectorul crescător, pe loc. sort este stabilă (păstrează ordinea elementelor egale); sort_unstable e mai rapidă.
  • Vec::binary_search: Caută rapid o valoare într-un vector sortat: Ok(poziție) dacă există, Err(poziție) unde ar trebui inserată.
  • Vec::windows: windows dă ferestre suprapuse de câte n elemente consecutive; chunks împarte vectorul în bucăți separate de câte n.
  • 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.