将向量中的每个元素与下一个进行比较

gon*_*ard 2 rust

我想将向量的每个元素与下一个进行比较。我找到了以下解决方案,但它不太可读。

struct Obj {
    i: u32,
}

impl Obj {
    fn is_valid_next(&self, next: &Obj) -> bool {
        self.i + 1 == next.i
    }
}

fn main() {
    let data: Vec<Obj> = vec![Obj { i: 0 }, Obj { i: 2 }, Obj { i: 2 }];
    let mut previous: Option<Obj> = None;
    let mut is_valid = true;
    for current in data.into_iter() {
        match previous {
            Some(p) => {
                is_valid = p.is_valid_next(&current);
                if !is_valid {
                    break;
                }
            }
            None => {}
        }
        previous = Some(current);
    }
    println!("is valid {}", is_valid);
}
Run Code Online (Sandbox Code Playgroud)

Öme*_*den 9

您可以与前一个通过使用相同的两个不同的迭代器比较当前元素Vecstd::iter::Zip

在迭代器中,第一个iterator(data.iter())中的元素将表示前一个元素的引用。来自第二个迭代器(data.iter().skip(1))的元素将表示当前元素的引用。

这是实现:

fn main() {
    let data: Vec<Obj> = vec![Obj { i: 0 }, Obj { i: 1 }, Obj { i: 2 }];

    let is_valid = data
        .iter()
        .zip(data.iter().skip(1))
        .all(|(prev, current)| prev.is_valid_next(current));

    println!("First -> {:?}", is_valid); // true
}
Run Code Online (Sandbox Code Playgroud)

操场


注意:如果您确定自己Vec不为空,则可以使用slice创建迭代器:

  • &data[1..]代替data.iter().skip(1)样本

但是请注意,如果空的话,恐慌Vec