在Rust中按值对哈希映射进行排序

3

在Python中,可以这样做:

>>> x = {1: 2, 3: 4, 4: 3, 2: 1, 0: 0}
>>> {k: v for k, v in sorted(x.items(), key=lambda item: item[1])}

{0: 0, 2: 1, 1: 2, 4: 3, 3: 4}

如何在Rust中按值对HashMap进行排序?
目前我的代码如下:
use std::collections::HashMap;

fn main() {
    let mut count: HashMap<String, u32>= HashMap::new();
    count.insert(String::from("A"), 5);
    count.insert(String::from("B"), 2);
    count.insert(String::from("C"), 11);
    count.insert(String::from("D"), 10);

    let highest = count.iter().max_by(|a, b| a.1.cmp(&b.1)).unwrap();

    println!("largest hash: {:?}", highest); // largest hash: ("C", 11)
}

你有尝试过但无法运行的代码吗? - Yannick Funk
5
哈希表在 Rust 或任何语言中都不是排序的,也不能排序。Python 的字典看起来排序是因为它们严格来说并不是哈希表。它们将(哈希值,键,值)三元组的向量与指向该向量的索引哈希表结合起来:https://mail.python.org/pipermail/python-dev/2012-December/123028.html。 - Jmb
1
@Jmb Python的字典看起来可能没有顺序,但它们绝对是有序的。 - Masklinn
1
@Masklinn 但它们也不是哈希表。它们在内部使用哈希表,但将该哈希表与向量结合起来以获得排序。 - Jmb
在编程中,“对哈希表排序”是自相矛盾的。 - user207421
显示剩余2条评论
2个回答

11

是的,通过将其转换为向量进行排序:

use std::collections::HashMap;

fn main() {
    let mut count: HashMap<String, u32>= HashMap::new();
    count.insert(String::from("A"), 5);
    count.insert(String::from("B"), 2);
    count.insert(String::from("C"), 11);
    count.insert(String::from("D"), 10);

    let mut hash_vec: Vec<(&String, &u32)> = count.iter().collect();
    println!("{:?}", hash_vec);
    hash_vec.sort_by(|a, b| b.1.cmp(a.1));

    println!("Sorted: {:?}", hash_vec); //Sorted: [("C", 11), ("D", 10), ("A", 5), ("B", 2)]
}

按值对HashMap数据进行排序


8
与Python的dict不同,Rust的“内置”哈希映射表是无序的,因此对其进行排序没有影响。
如果您需要有序的映射,应该使用indexmap。或者,BTreeMap 基于键进行排序
由于你没有提供任何令人信服的用例,所以很难提供建议。

抱歉没有提供使用案例,我需要哈希映射中前N个最高的值,所以将其转换为向量解决了问题。 - Amiya Behera

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接