You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何从Rust的HashMap中获取所有对应最大值的键?

如何从Rust的HashMap中获取所有对应最大值的键?

你遇到的问题其实很典型——当HashMap里有多个键对应同一个最大值时,直接用max_by_key只能拿到迭代器遍历到的第一个符合条件的条目,所以才只输出了World,漏掉了同样出现2次的Hello。想要把所有符合要求的键都捞出来,可以分两步走:

解决思路

  1. 先确定HashMap中的最大值是多少;
  2. 遍历整个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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.07 08:54:31