Rust枚举变体计数实现(静态内存方案)及元素统计内置函数查询
问题解答
一、用静态数组统计枚举值重复次数
因为你的Value枚举变体数量在编译时固定(共13种),完全可以用数组替代HashMap实现统计,这种方式是静态分配内存,性能比HashMap更优。
实现步骤:
- 给
Value实现到usize的转换,将每个变体映射到唯一的数组索引(0到12); - 创建长度为13的数组,初始值全为0;
- 遍历手牌中的每个牌值,转换为索引后给对应数组位置的计数加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
相关产品推荐
相关产品推荐

