根据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中元素的频率和位置排序向量的主要内容,如果未能解决你的问题,请参考以下文章

根据元素的频率对数组进行排序

我想要一些关于如何根据元素频率对列表进行排序的帮助[重复]

set 获取元素的位置

Rust插入排序

Rust 是不是有办法将函数/方法应用于数组或向量中的每个元素?

按 C 中元素出现频率的降序对数组进行排序