从向量中删除相邻值
Removing adjacent values from vector
我制作了这个函数,它应该删除它从向量中找到的所有相邻值。
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];
它还应该删除 7
之后的三个 3
值,但它却陷入了无限循环。我自己找不到错误,如果有人有解决此问题的提示,我将不胜感激。
除了获取 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)
.
之后得到的迭代器中
我希望查看打印的值和我的线索可以指导您自行修复错误。祝你好运!
我制作了这个函数,它应该删除它从向量中找到的所有相邻值。
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];
它还应该删除 7
之后的三个 3
值,但它却陷入了无限循环。我自己找不到错误,如果有人有解决此问题的提示,我将不胜感激。
除了获取 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)
.
我希望查看打印的值和我的线索可以指导您自行修复错误。祝你好运!