根据Rust中元素的频率和位置排序向量
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了根据Rust中元素的频率和位置排序向量相关的知识,希望对你有一定的参考价值。
我有一个向量,我想对它进行排序,其中第一个标准是频率。第二个准则是向量中的位置。如果两个元素的出现次数相同,则我希望最近出现的元素能够利用并优先考虑。最后,我想从中删除重复的元素。
例如,如果输入是这个:
fn main() {
let history = vec![3, 2, 4, 6, 2, 4, 3, 3, 4, 5, 6, 3, 2, 4, 5, 5, 3];
}
输出应为:
3 4 5 2 6
如何在Rust中执行此操作?
答案
一种简单的方法是为元素的频率和位置构建哈希图:
use std::collections::HashMap;
fn frequency_map(nums: &[i32]) -> HashMap<i32, usize> {
let mut map = HashMap::new();
for &n in nums {
*map.entry(n).or_insert(0) += 1;
}
map
}
fn position_map(nums: &[i32]) -> HashMap<i32, usize> {
let mut map = HashMap::new();
for (pos, &n) in nums.iter().enumerate() {
map.insert(n, pos);
}
map
}
然后按照位置进行不稳定的排序,然后按照频率进行稳定的排序:
fn custom_sort(nums: &mut Vec<i32>) {
let freq_map = frequency_map(nums);
let pos_map = position_map(nums);
nums.sort_unstable_by(|a, b| pos_map.get(b).unwrap().cmp(pos_map.get(a).unwrap()));
nums.dedup();
nums.sort_by(|a, b| freq_map.get(b).unwrap().cmp(freq_map.get(a).unwrap()));
}
示例:
use itertools::Itertools;
fn main() {
let mut history = vec![3, 2, 4, 6, 2, 4, 3, 3, 4, 5, 6, 3, 2, 4, 5, 5, 3];
custom_sort(&mut history);
println!("[{}]", history.iter().format(", "));
}
输出:
[3, 4, 5, 2, 6]
([playground)
以上是关于根据Rust中元素的频率和位置排序向量的主要内容,如果未能解决你的问题,请参考以下文章