我想将向量的每个元素与下一个进行比较。我找到了以下解决方案,但它不太可读。
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(¤t);
if !is_valid {
break;
}
}
None => {}
}
previous = Some(current);
}
println!("is valid {}", is_valid);
}
答案 0 :(得分:9)
您可以使用Vec
与std::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
}
注意:如果您确定自己的Vec
不为空,则可以使用切片来创建迭代器:
&data[1..]
而不是data.iter().skip(1)
(sample)但是请注意,如果您有一个空的Vec
,将会慌乱。