Rust中有没有可统计Vec中元素出现频率的现成函数或库?
统计Vec元素频率的crate及使用方法
你可以使用Rust生态普及度极高的迭代器工具库itertools实现需求,它的维护状态和适用场景都优于你找到的frequency crate。
基础用法:频率统计
- 首先在
Cargo.toml中添加依赖:
[dependencies] itertools = "0.12"
- 代码示例:
use itertools::Itertools; fn main() { let input = vec![1,1,1,4,1,2,3,5,4]; // counts()方法直接返回存储了元素-频率映射的HashMap let frequency_map = input.into_iter().counts(); // 转为你需要的Vec<(元素, 频率)>格式,输出顺序不固定 let result: Vec<(i32, usize)> = frequency_map.into_iter().collect(); println!("{:?}", result); // 输出示例:[(1, 4), (4, 2), (2, 1), (3, 1), (5, 1)] }
反向功能实现
如果需要从频率统计结果还原为原始序列,可以配合标准库的repeat_n方法实现:
fn main() { let frequency = vec![(1,4), (2,1), (3,1), (4,2), (5,1)]; let origin: Vec<i32> = frequency.into_iter() .flat_map(|(val, count)| std::iter::repeat_n(val, count)) .collect(); println!("{:?}", origin); // 输出:[1, 1, 1, 1, 2, 3, 4, 4, 5] }
frequency crate的使用示例
如果你要使用你搜索到的frequency crate,使用方式如下:
- 添加依赖:
[dependencies] frequency = "1.0.1"
- 代码示例:
use frequency::Frequency; fn main() { let input = vec![1,1,1,4,1,2,3,5,4]; let frequency_map = input.frequency_map(); let result: Vec<(i32, usize)> = frequency_map.into_iter().collect(); println!("{:?}", result); }
内容的提问来源于stack exchange,提问作者Jakob E.
相关产品推荐
相关产品推荐

