我制作了这个函数,它应该删除它从向量中找到的所有相邻值。
fn remove_adjacent<T: std::cmp::PartialEq>(values: &mut Vec<T>, item: T) {
let mut offset = 0;
while let Some(idx) = values.iter().skip(offset).position(|n| *n == item) {
let length = values
.iter()
.skip(idx)
.position(|v| *v != item)
.unwrap_or(values.len() - idx);
if length > 1 {
values.drain(idx + 1..length + idx);
}
offset = idx + 1;
}
}
它适用于像
这样的向量vec![2, 1, 3, 3, 3, 3, 3];
但不适用于要删除的目标元素在非目标值之后重复的向量,例如
vec![2, 1, 3, 3, 3, 3, 3, 7, 3, 3, 3];
它还应该删除 3
之后的三个 7
值,但它会陷入无限循环。我自己无法找到错误,如果有人有解决此问题的提示,我将不胜感激。
答案 0 :(得分:0)
除了获取 idx
之外,您的代码中的所有内容都可以正常工作。
您可以打印出 idx
并查看它有什么问题。打印 offset
也有帮助。
fn remove_adjacent<T: std::cmp::PartialEq>(values: &mut Vec<T>, item: T) {
let mut offset = 0;
while let Some(idx) = values.iter().skip(offset).position(|n| *n == item) {
dbg!(idx, offset); // prints out nicely
let length = values
.iter()
.skip(idx)
.position(|v| *v != item)
.unwrap_or(values.len() - idx);
if length > 1 {
values.drain(idx + 1..length + idx);
}
offset = idx + 1;
}
}
您会注意到 idx
并不总是您想要的。
发生这种情况是因为 .position(
不在 values
中计数,而是在 .skip(offset)
之后获得的迭代器中计数。
我希望查看打印的值,我的提示可以指导您自行修复错误。祝你好运! ?