Rust统计字符串指定字符出现次数 find()仅返回首个匹配位置
Rust实现字符串指定字符出现次数统计
find()方法的设计逻辑就是仅返回第一个匹配项的索引,本身就不支持全量匹配计数,直接用它做次数统计不符合方法的设计预期,以下是可直接运行的正确实现:
实现代码
补全了原代码缺失的键盘输入逻辑,采用Rust最惯用的迭代器写法实现统计,兼容中文、emoji等多字节字符:
use std::fs; use std::io; fn main() { // 读取目标文本文件 let data = fs::read_to_string("./Text").expect("文件读取失败,请检查./Text路径是否有效"); // 读取键盘输入的待统计字符 println!("请输入需要统计的字符:"); let mut input_buf = String::new(); io::stdin() .read_line(&mut input_buf) .expect("键盘输入读取失败"); // 解析输入,自动去除输入末尾的换行符,取第一个有效字符作为统计目标 let target = match input_buf.trim().chars().next() { Some(c) => c, None => { eprintln!("错误:未检测到有效输入字符"); return; } }; // 遍历字符迭代器,筛选匹配项后计数 let occur_count = data.chars().filter(|&curr_char| curr_char == target).count(); println!("字符 '{}' 的总出现次数为:{}", target, occur_count); }
注意事项
- 不要通过循环调用
find()的方式实现计数:每次调用find()都会从指定位置重新扫描字符串,时间复杂度更高,性能远差于单次迭代遍历的写法。 - 如果确定统计目标仅为ASCII字符,可以将字符遍历替换为字节遍历获得小幅性能提升,将计数逻辑替换为
let occur_count = data.bytes().filter(|&b| b as char == target).count();即可,该写法不可用于多字节字符统计场景,否则会出现统计错误。
内容的提问来源于stack exchange,提问作者Phan Hoàng Long
相关产品推荐
相关产品推荐

