You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Rust中迭代HashMap时获取并修改值及键值对反转实现问题

在Rust中操作HashMap的常见问题解答

一、迭代HashMap时获取并修改值的方法

在Rust里修改HashMap的值,核心是拿到可变引用,常用的实现方式有两种:

1. 使用iter_mut()遍历可变引用

iter_mut()会返回HashMap的可变迭代器,让你直接遍历并修改每个键值对的值:

use std::collections::HashMap;

fn main() {
    let mut map = HashMap::from([("a", 1), ("b", 2)]);
    
    // 遍历并把每个值加1
    for (key, val) in map.iter_mut() {
        *val += 1;
        println!("{}: {}", key, val);
    }
}

这里要注意必须用*解引用val——因为它是&mut i32类型,只有解引用后才能修改底层的数值。

2. 使用entry() API(更灵活的修改/插入方式)

如果需要针对特定键判断是否存在,再决定修改或插入新值,entry()是更高效的选择(避免重复查找键):

use std::collections::HashMap;

fn main() {
    let mut map = HashMap::new();
    let key = "a";
    
    // 找到键"a"的条目,不存在则插入默认值0,存在则直接修改值
    map.entry(key.to_string())
        .and_modify(|val| *val += 1)
        .or_insert(0);
}

二、完善反转键值对的代码

你的需求是把原(String, Vec<String>)集合,转换为原数组元素作为新键、原键存入对应HashSet的HashMap,用entry() API就能完美处理“存在则追加、不存在则创建”的场景,以下是完善后的代码:

use std::collections::{HashMap, HashSet};

pub fn convert_map(my_tuples: Vec<(String, Vec<String>)>) -> HashMap<String, HashSet<String>> {
    let mut my_map = HashMap::<String, HashSet<String>>::new();
    
    for (original_key, new_keys) in my_tuples {
        for new_key in new_keys {
            // 针对每个new_key,获取或创建对应的HashSet,再插入原键
            my_map.entry(new_key)
                .or_insert_with(HashSet::new)
                .insert(original_key.clone());
        }
    }
    
    my_map
}

// 测试示例
fn main() {
    let input = vec![
        ("a".to_string(), vec!["1".to_string(), "2".to_string(), "3".to_string()]),
        ("b".to_string(), vec!["3".to_string(), "4".to_string(), "5".to_string()]),
    ];
    
    let result = convert_map(input);
    for (k, v) in result {
        println!("{}: {:?}", k, v);
    }
}

代码说明:

  • entry(new_key):查找new_key对应的条目,返回Entry枚举(Occupied表示键已存在,Vacant表示键不存在)
  • or_insert_with(HashSet::new):如果键不存在,就调用HashSet::new创建新集合并插入;如果存在,直接返回已有集合的可变引用
  • insert(original_key.clone()):把原键插入到HashSet中,HashSet会自动去重,不用担心重复添加同一个原键

运行后会输出你预期的结果:

1: {"a"}
2: {"a"}
3: {"a", "b"}
4: {"b"}
5: {"b"}

内容的提问来源于stack exchange,提问作者cm007

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.27 03:29:23