如何在循环中从可变字符串中删除字符?

问题描述

我正在尝试在循环中删除可变字符串中的一些字符:

fn main() {
    let mut var1 = String::from("BASDFSADLfasLOONBASDFSADLfasLOON");
    let chars: [char; 5] = ['B','A','L','O','N'];
    find_balloon(&mut var1,&chars);
}

fn find_balloon<'a>(s: &'a mut String,chars: &'a [char; 5]) {
    for (i,p) in s.char_indices() {
        if chars.iter().any(|&x| x == p) {
            let mut x = s.remove(i);
            println!("{}",x);
        }
    }
}

我得到的错误如下:

@H_502_8@error[E0502]: cannot borrow `*s` as mutable because it is also borrowed as immutable --> src/main.rs:10:25 | 8 | for (i,p) in s.char_indices() { | ---------------- | | | immutable borrow occurs here | immutable borrow later used here 9 | if chars.iter().any(|&x| x == p) { 10 | let mut x = s.remove(i); | ^^^^^^^^^^^ mutable borrow occurs here

解决方法

您可以使用String::retain方法。它完全可以实现您想要的功能,而无需其他分配。

fn find_balloon(s: &mut String,chars: &[char; 5]) {
    s.retain(|p| if chars.contains(&p) {
        false
    } else {
        print!("{}",p);
        true
    });
}

fn main() {
    let mut var1 = String::from("BASDFSADLfasLOONBASDFSADLfasLOON");
    let chars: [char; 5] = ['B','A','L','O','N' ];
    find_balloon(&mut var1,&chars);
}
,

您不能从当前正在迭代的字符串中删除元素。相反,只需使用迭代器的filter方法并收集到字符串中即可:

// using a hashset instead of a slice due to hashsets being faster
// the slice.iter().any approach still works though
use std::collections::HashSet;

fn find_balloon(s: &mut String,chars: &HashSet<char>) {
    let filtered: String = s.chars().filter(|x| !chars.contains(x)).collect();
    println!("{}",filtered);
}

fn main() {
    let mut var1 = String::from("BASDFSADLfasLOONBASDFSADLfasLOON");
    let chars: [char; 5] = ['B','N'];
    find_balloon(&mut var1,&chars.iter().cloned().collect());
}