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

Rust枚举变体计数实现(静态内存方案)及元素统计内置函数查询

问题解答

一、用静态数组统计枚举值重复次数

因为你的Value枚举变体数量在编译时固定(共13种),完全可以用数组替代HashMap实现统计,这种方式是静态分配内存,性能比HashMap更优。

实现步骤:

  1. 给Value实现到usize的转换,将每个变体映射到唯一的数组索引(0到12);
  2. 创建长度为13的数组,初始值全为0;
  3. 遍历手牌中的每个牌值,转换为索引后给对应数组位置的计数加1。

代码示例:

#[derive(Debug, Clone, PartialEq, Eq)]
enum Value {
    Ace,
    King,
    Queen,
    Jack,
    Ten,
    Nine,
    Eight,
    Seven,
    Six,
    Five,
    Four,
    Three,
    Two,
}

impl From<Value> for usize {
    fn from(value: Value) -> Self {
        match value {
            Value::Ace => 0,
            Value::King => 1,
            Value::Queen => 2,
            Value::Jack => 3,
            Value::Ten => 4,
            Value::Nine => 5,
            Value::Eight => 6,
            Value::Seven => 7,
            Value::Six => 8,
            Value::Five => 9,
            Value::Four => 10,
            Value::Three => 11,
            Value::Two => 12,
        }
    }
}

fn count_hand_values(hand: &[Value]) -> [usize; 13] {
    let mut counts = [0; 13];
    for &val in hand {
        let idx = usize::from(val);
        counts[idx] += 1;
    }
    counts
}

使用时,调用count_hand_values传入手牌切片即可,返回的数组中每个位置对应Value变体的出现次数,比如索引0对应Ace的次数,索引1对应King的次数,以此类推。

二、关于元素计数的counts()函数

Rust标准库中并没有直接提供名为counts()的方法,但可以通过两种方式实现类似功能:

1. 标准库手动实现

用Iterator::fold方法手动构建统计哈希表:

use std::collections::HashMap;

fn counts<T: Eq + std::hash::Hash>(iter: impl IntoIterator<Item = T>) -> HashMap<T, usize> {
    iter.into_iter()
        .fold(HashMap::new(), |mut map, item| {
            *map.entry(item).or_insert(0) += 1;
            map
        })
}

// 使用示例
fn main() {
    let a = vec![1, 2, 1, 3, 2, 4];
    let b = counts(a);
    let mut c = HashMap::new();
    c.insert(1, 2);
    c.insert(2, 2);
    c.insert(3, 1);
    c.insert(4, 1);
    assert_eq!(b, c);
}

2. 使用itertools库的现成方法

第三方库itertools提供了Itertools::counts()方法,完全匹配你想要的功能。

首先在Cargo.toml中添加依赖:

[dependencies]
itertools = "0.12"

然后调用使用:

use itertools::Itertools;

fn main() {
    let a = vec![1, 2, 1, 3, 2, 4];
    let b = a.into_iter().counts();
    let mut c = HashMap::new();
    c.insert(1, 2);
    c.insert(2, 2);
    c.insert(3, 1);
    c.insert(4, 1);
    assert_eq!(b, c);
}

内容的提问来源于stack exchange,提问作者Pioneer_11

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.27 06:22:36