等效于 HashMap 的 split_at_mut?

TuB*_*ent 2 rust borrow-checker

考虑以下代码(最小示例):

use std::collections::HashMap;
fn main() {
    let mut map: HashMap<usize, i128> = HashMap::new();
    map.insert(1, -5);
    map.insert(2, 6);
    map.insert(3, 7);
    for i in map.keys() {
        if *i == 3 {
            continue;
        }
       *map.get_mut(&3).unwrap() += map[i];
    }
}
Run Code Online (Sandbox Code Playgroud)

借阅检查员会抱怨:

use std::collections::HashMap;
fn main() {
    let mut map: HashMap<usize, i128> = HashMap::new();
    map.insert(1, -5);
    map.insert(2, 6);
    map.insert(3, 7);
    for i in map.keys() {
        if *i == 3 {
            continue;
        }
       *map.get_mut(&3).unwrap() += map[i];
    }
}
Run Code Online (Sandbox Code Playgroud)

但是,在这种情况下,我可以确定我所做的更改不会干扰不可变引用。For Vec,我会split_at_mut在这里使用-HashMap在 Rust 中是否有等效的 for ?

编辑:

正如评论指出的那样,让我更具体地说明我要解决的问题。我想将图中的顶点“合并”到一个顶点中。为此,我创建了一个HashMap

pub mergedVerticesList: HashMap<usize, HashSet<usize>>
Run Code Online (Sandbox Code Playgroud)

它应该从一个顶点映射到所有已合并到该顶点的顶点。由于这可以递归完成,因此在撤消u和之间的合并时,merge_onto我想删除merge_onto由于ufrommerge_onto的所有已合并的顶点HashSet。因此,代码如下所示:

for i in self.mergedVerticesList[v].iter() {
    self.mergedVerticesList.get_mut(&merge_onto).unwrap().remove(i);
}
Run Code Online (Sandbox Code Playgroud)

use*_*968 5

不,就目前HashMap而言,这是不可能的。您可以将单元格作为值来重新获得可变访问权限,但我强烈建议不要这样做。您不能将更改移出循环(它还可以从每次迭代的重复查找中保存)。有什么好听的

use std::collections::HashMap;
fn main() {
    let mut map: HashMap<usize, i128> = HashMap::new();
    map.insert(1, -5);
    map.insert(2, 6);
    map.insert(3, 7);
    let s = map.iter().filter_map(|(k, v)| if *k != 3 { Some(v) } else { None }).sum::<i128>();
    *map.get_mut(&3).unwrap() += s;
    println!("{:#?}", &map)
}
Run Code Online (Sandbox Code Playgroud)