从向量中删除相邻值

时间:2021-02-25 23:13:31

标签: loops vector rust infinite-loop

我制作了这个函数,它应该删除它从向量中找到的所有相邻值。

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 值,但它会陷入无限循环。我自己无法找到错误,如果有人有解决此问题的提示,我将不胜感激。

Example on Rust Playground

1 个答案:

答案 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) 之后获得的迭代器中计数。

我希望查看打印的值,我的提示可以指导您自行修复错误。祝你好运! ?

相关问题