如何在HashMap中查找存在单复数拼写错误的键?
处理单复数拼写错误的简洁解决方案
可以通过生成原字符串的单复数变体候选列表,结合迭代器方法简化匹配逻辑,避免繁琐的嵌套判断。以下是具体实现:
辅助函数实现
// 首字母大写、其余字符小写的格式化函数 fn capitalize(s: &str) -> String { let mut chars = s.chars(); match chars.next() { None => String::new(), Some(first) => { first.to_uppercase().collect::<String>() + chars.as_str().to_lowercase().as_str() } } } // 生成原字符串的单复数变体候选 fn get_plural_variants(s: &str) -> Vec<String> { let mut variants = vec![s.to_string()]; if s.ends_with('s') { // 输入为复数,尝试匹配单数形式 variants.push(s[0..s.len()-1].to_string()); } else { // 输入为单数,尝试匹配复数形式 variants.push(format!("{}s", s)); } variants }
修改后的主逻辑
use std::collections::HashMap; let m: HashMap<&str, i32> = ...; // 你的HashMap初始化逻辑 let mut n = 0; // 假设n为初始值0的整数 for s in &fruits { let capitalized = capitalize(s); // 遍历变体列表,找到第一个存在于HashMap中的值 let found_value = get_plural_variants(&capitalized) .iter() .find_map(|variant| m.get(variant.as_str())) .copied(); match found_value { Some(value) => n |= value, None => println!("{} does not exist", s), } }
关键逻辑说明
get_plural_variants函数会自动生成包含原格式化字符串和对应单复数变体的列表,覆盖用户输入与后端预期单复数相反的场景。find_map方法会遍历变体列表,找到第一个能在HashMap中匹配到的值并返回,替代了繁琐的嵌套match判断。- 整体逻辑封装后,主代码保持简洁清晰,后续维护或扩展其他拼写规则也更方便。
内容的提问来源于stack exchange,提问作者Antonin GAVREL
相关产品推荐
相关产品推荐

