在Rust中通过HashMap处理缺失键:字母数字字符串解码问题
字母数字字符串解码:字母映射HashMap,数字直接转对应u32
针对你的需求,只需要在map闭包里区分处理字母和数字字符即可——字母从HashMap中取值,数字字符直接转换为对应的u32数值。这里提供两种简洁的实现方式:
方式一:使用unwrap_or_else处理缺失值
利用unwrap_or_else在HashMap找不到对应键时执行数字转换逻辑,代码如下:
use std::collections::HashMap; fn main() { let translit: HashMap<char, u32> = HashMap::from([ ('A', 1),('B', 2),('C', 3),('D', 4),('E', 5),('F', 6),('G', 7),('H', 8), ('J', 1),('K', 2),('L', 3),('M', 4),('N', 5),('P', 7),('R', 9),('S', 2), ('T', 3),('U', 4),('V', 5),('W', 6),('X', 7),('Y', 8),('Z', 9) ]); let s = String::from("4S3BJ"); let transliterated: Vec<u32> = s.chars() .map(|c| { // 先尝试从HashMap获取字母映射值,copied()将&u32转为u32 translit.get(&c) .copied() // 若找不到,将数字字符转为u32,expect处理非预期字符 .unwrap_or_else(|| c.to_digit(10).expect("输入包含非字母数字字符")) }) .collect(); dbg!(transliterated); // 输出: [4, 2, 3, 2, 1] }
方式二:使用match显式分支处理
通过match直接区分数字和字母的处理逻辑,代码可读性更强:
use std::collections::HashMap; fn main() { let translit: HashMap<char, u32> = HashMap::from([ ('A', 1),('B', 2),('C', 3),('D', 4),('E', 5),('F', 6),('G', 7),('H', 8), ('J', 1),('K', 2),('L', 3),('M', 4),('N', 5),('P', 7),('R', 9),('S', 2), ('T', 3),('U', 4),('V', 5),('W', 6),('X', 7),('Y', 8),('Z', 9) ]); let s = String::from("4S3BJ"); let transliterated: Vec<u32> = s.chars() .map(|c| match c { // 处理数字字符,直接转u32 '0'..='9' => c.to_digit(10).unwrap(), // 处理字母,从HashMap取值,panic处理未知字母 _ => *translit.get(&c).unwrap_or_else(|| panic!("未知字符: {}", c)) }) .collect(); dbg!(transliterated); // 输出: [4, 2, 3, 2, 1] }
关键说明
c.to_digit(10):将ASCII数字字符转换为对应的u32数值,返回Option<u32>,若字符不是数字则返回None。copied():避免手动解引用&u32,直接获取HashMap中存储的u32值。- 错误处理:示例中用
expect和panic!处理非预期字符,若需要更优雅的错误处理,可以将返回类型改为Result<Vec<u32>, String>。
内容的提问来源于stack exchange,提问作者Coldchain9
相关产品推荐
相关产品推荐

