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

时间:2019-11-25 09:14:39

标签: 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);
}

1 个答案:

答案 0 :(得分:9)

您可以使用Vecstd::iter::Zip的两个不同的迭代器将当前元素与上一个元素进行比较。

在第一个迭代器(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
}

Playground


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

  • &data[1..]而不是data.iter().skip(1)sample

但是请注意,如果您有一个空的Vec,将会慌乱。

相关问题