// // 案例 8.5实战——单词统计工具 // 功能统计用户输入文本中的单词出现次数 // 知识点HashMap entry API、字符串处理、用户输入、字符过滤、迭代器排序 // 输入多行英文文本输入空行结束录入 // 输出总单词数量、去重单词总数、Top10高频单词 // // 导入哈希表集合用于存储「单词-出现次数」键值对 use std::collections::HashMap; // 导入标准输入输出库读取控制台用户输入 use std::io; fn main() { // 打印程序标题分隔线 println!(); println!( 单词统计工具); println!(); println!(请输入一段英文文本输入空行结束); // 可变字符串拼接用户输入的所有文本行 let mut text String::new(); // 循环读取多行输入直到用户输入空行退出录入 loop { // 临时存储单行输入 let mut line String::new(); // 读取一行控制台输入失败直接panic提示读取失败 io::stdin().read_line(mut line).expect(读取失败); // 去除该行首尾空格、换行符得到清洗后的行引用 let line line.trim(); // 输入为空行终止多行输入循环 if line.is_empty() { break; } // 将当前有效行追加到总文本 text.push_str(line); // 追加空格分隔上下两行的单词避免跨行单词粘连 text.push( ); } // 判断用户是否完全没有输入内容直接结束程序 if text.is_empty() { println!(⚠️ 未输入任何文本); return; } // ---------------------- 单词统计核心逻辑 ---------------------- // 定义哈希表key小写单词value单词出现次数 let mut word_count: HashMapString, u32 HashMap::new(); // 以任意空白空格/制表符分割全部文本遍历每一个原始单词 for word in text.split_whitespace() { // 字符过滤只保留字母与连字符过滤逗号、句号、感叹号等标点 let clean_word: String word .chars() // 将单词转为字符迭代器 .filter(|c| c.is_alphabetic() || *c -) // 过滤规则仅字母、短横线保留 .collect(); // 将过滤后的字符重新拼接为字符串 // 过滤完全由标点组成、清洗后为空的无效片段 if !clean_word.is_empty() { // HashMap entry API查询单词不存在则插入初始值0返回次数的可变引用 let count word_count.entry(clean_word.to_lowercase()).or_insert(0); // 次数自增1 *count 1; } } // ---------------------- 输出统计结果 ---------------------- println!(\n); println!( 统计结果); println!(); // 原始总单词数量未去重含带标点原始单词 println!(总单词数: {}, text.split_whitespace().count()); // 去重后单词总数量清洗、统一小写后的有效单词 println!(不重复单词: {}, word_count.len()); println!(\n【单词频率】); // 将HashMap迭代器转为可排序向量元素是(单词引用, 次数引用) let mut sorted: Vec(String, u32) word_count.iter().collect(); // 按单词出现次数降序排序次数相同则顺序随机 sorted.sort_by(|a, b| b.1.cmp(a.1)); // 只打印前10个高频单词 for (word, count) in sorted.iter().take(10) { println!( {}: {}, word, count); } // 如果去重单词超过10个打印省略提示与总数量 if sorted.len() 10 { println!( ... (共 {} 个单词), sorted.len()); } println!(\n✅ 分析完成); }
rust示例2-单词统计工具
发布时间:2026/7/10 1:25:19
// // 案例 8.5实战——单词统计工具 // 功能统计用户输入文本中的单词出现次数 // 知识点HashMap entry API、字符串处理、用户输入、字符过滤、迭代器排序 // 输入多行英文文本输入空行结束录入 // 输出总单词数量、去重单词总数、Top10高频单词 // // 导入哈希表集合用于存储「单词-出现次数」键值对 use std::collections::HashMap; // 导入标准输入输出库读取控制台用户输入 use std::io; fn main() { // 打印程序标题分隔线 println!(); println!( 单词统计工具); println!(); println!(请输入一段英文文本输入空行结束); // 可变字符串拼接用户输入的所有文本行 let mut text String::new(); // 循环读取多行输入直到用户输入空行退出录入 loop { // 临时存储单行输入 let mut line String::new(); // 读取一行控制台输入失败直接panic提示读取失败 io::stdin().read_line(mut line).expect(读取失败); // 去除该行首尾空格、换行符得到清洗后的行引用 let line line.trim(); // 输入为空行终止多行输入循环 if line.is_empty() { break; } // 将当前有效行追加到总文本 text.push_str(line); // 追加空格分隔上下两行的单词避免跨行单词粘连 text.push( ); } // 判断用户是否完全没有输入内容直接结束程序 if text.is_empty() { println!(⚠️ 未输入任何文本); return; } // ---------------------- 单词统计核心逻辑 ---------------------- // 定义哈希表key小写单词value单词出现次数 let mut word_count: HashMapString, u32 HashMap::new(); // 以任意空白空格/制表符分割全部文本遍历每一个原始单词 for word in text.split_whitespace() { // 字符过滤只保留字母与连字符过滤逗号、句号、感叹号等标点 let clean_word: String word .chars() // 将单词转为字符迭代器 .filter(|c| c.is_alphabetic() || *c -) // 过滤规则仅字母、短横线保留 .collect(); // 将过滤后的字符重新拼接为字符串 // 过滤完全由标点组成、清洗后为空的无效片段 if !clean_word.is_empty() { // HashMap entry API查询单词不存在则插入初始值0返回次数的可变引用 let count word_count.entry(clean_word.to_lowercase()).or_insert(0); // 次数自增1 *count 1; } } // ---------------------- 输出统计结果 ---------------------- println!(\n); println!( 统计结果); println!(); // 原始总单词数量未去重含带标点原始单词 println!(总单词数: {}, text.split_whitespace().count()); // 去重后单词总数量清洗、统一小写后的有效单词 println!(不重复单词: {}, word_count.len()); println!(\n【单词频率】); // 将HashMap迭代器转为可排序向量元素是(单词引用, 次数引用) let mut sorted: Vec(String, u32) word_count.iter().collect(); // 按单词出现次数降序排序次数相同则顺序随机 sorted.sort_by(|a, b| b.1.cmp(a.1)); // 只打印前10个高频单词 for (word, count) in sorted.iter().take(10) { println!( {}: {}, word, count); } // 如果去重单词超过10个打印省略提示与总数量 if sorted.len() 10 { println!( ... (共 {} 个单词), sorted.len()); } println!(\n✅ 分析完成); }