如何从Rust的HashMap中获取所有对应最大值的键?
如何从Rust的HashMap中获取所有对应最大值的键?
你遇到的问题其实很典型——当HashMap里有多个键对应同一个最大值时,直接用max_by_key只能拿到迭代器遍历到的第一个符合条件的条目,所以才只输出了World,漏掉了同样出现2次的Hello。想要把所有符合要求的键都捞出来,可以分两步走:
解决思路
- 先确定HashMap中的最大值是多少;
- 遍历整个HashMap,筛选出所有值等于这个最大值的键,收集到一个Vec里。
完整代码示例
use std::collections::HashMap; fn main() { let words = vec!["Hello", "World", "Hello", "everybody", "in", "the", "World"]; let mut word_count = HashMap::new(); // 统计词频,这部分和你写的逻辑一致 for word in words { *word_count.entry(word).or_insert(0) += 1; } // 第一步:获取最大值(处理空HashMap的情况,避免panic) let max_count = word_count.values().max().copied(); match max_count { Some(max) => { // 第二步:筛选所有值等于最大值的键并收集 let max_words: Vec<_> = word_count .iter() .filter(|(_, &count)| count == max) .map(|(word, _)| *word) .collect(); println!("所有出现次数最多的词:{:?}", max_words); // 输出: ["Hello", "World"] } None => { println!("HashMap是空的,没有可统计的数据哦"); } } }
代码说明
word_count.values().max():从HashMap的所有值中找到最大值的引用,copied()会把引用转换成原始数值类型(比如这里的i32),避免后续处理引用的麻烦;- 用
match处理max_count:如果HashMap为空,max会是None,这时可以给出友好提示,而不是直接unwrap导致程序崩溃; filter配合map:先过滤出值等于最大值的条目,再提取其中的键,最后用collect()把这些键收集到Vec中。
相关问题:获取单个最大值对应的键
如果你只需要拿到任意一个对应最大值的键,你原来的代码其实是可行的,但要注意空HashMap的情况:
// 安全写法,避免空HashMap导致panic match word_count.iter().max_by_key(|entry| entry.1) { Some((word, &count)) => println!("出现次数最多的词:{},次数:{}", word, count), None => println!("HashMap中没有数据"), }
如果能确保HashMap一定不为空,用unwrap也可以,但生产代码里更推荐用match或者if let来做安全处理。
内容来源于stack exchange
相关产品推荐
相关产品推荐

