我想按Rust中的值对HashMap数据进行排序(例如,在计算字符串中的字符频率时).

与我try 做的工作类似的Python是:

count = {}
for c in text:
    count[c] = count.get('c', 0) + 1

sorted_data = sorted(count.items(), key=lambda item: -item[1])

print('Most frequent character in text:', sorted_data[0][0])

我对应的防 rust 代码如下所示:

// Count the frequency of each letter
let mut count: HashMap<char, u32> = HashMap::new();
for c in text.to_lowercase().chars() {
    *count.entry(c).or_insert(0) += 1;
}

// Get a sorted (by field 0 ("count") in reversed order) list of the
// most frequently used characters:
let mut count_vec: Vec<(&char, &u32)> = count.iter().collect();
count_vec.sort_by(|a, b| b.1.cmp(a.1));

println!("Most frequent character in text: {}", count_vec[0].0);

这是惯用的 rust 吗?我能否以某种方式构造count_vec,使其能够使用HashMaps数据并拥有它(例如,使用map())?这会不会更像我的风格?

推荐答案

这是惯用的 rust 吗?

没有什么特别的unidiomatic,除了count_vec上不必要的完整类型约束possibly;你可以用

let mut count_vec: Vec<_> = count.iter().collect();

从上下文来看,弄清count_vec的完整类型并不困难.您可以省略count entirely的类型约束,但接下来必须对整型文字进行恶作剧,才能推断出正确的值类型.也就是说,在这种情况下,明确的注释是非常合理的.

您可以对if you feel like it进行other边界更改,将|a, b| a.1.cmp(b.1).reverse()用于排序结束.Ordering::reverse方法只是反转结果,使小于变为大于,反之亦然.这使得你更清楚地知道你写的是什么,而不是意外地转置了两个字母.

我能否以某种方式构造count_vec,使其能够使用HashMaps数据并拥有它?

没有任何意义.仅仅因为HashMap使用内存并不意味着内存在任何方面都与Vec兼容.您可以使用count.into_iter()consume来替换HashMap,并将元素移出(而不是在指针上迭代),但由于charu32都是可复制的,所以这并不能真正为您带来任何好处.

Rust相关问答推荐

将大小为零的类型实例存储到空指针中

返回的future 不是`发送`

带扫描的铁 rust 使用滤镜

无法理解铁 rust &S错误处理

编译项目期间使用Cargo生成时出现rustc错误

在rust sqlx中使用ilike和push bind

如何从ruust中的fig.toml中读取?

如何防止Cargo 单据和Cargo 出口发布( crate )项目

不能在Rust中使用OpenGL绘制三角形

Rust从关联函数启动线程

Rust proc_macro 和 syn:解析空格

Rust,如何从 Rc> 复制内部值并返回它?

`UnsafeCell` 在没有锁定的情况下跨线程共享 - 这可能会导致 UB,对吗?

错误:将自定义 proc_macro 与用Rust 的宝贝编写的属性一起使用时,无法在此范围内找到属性

bcrypt 有长度限制吗?

如何判断服务器是否正确接收数据

Rust 异步和 AsRef 未被发送

在 Rust 中如何将值推送到枚举 struct 内的 vec?

如何在 Rust 中创建最后一个元素是可变长度数组的 struct ?

如何创建动态创建值并向它们返回borrow 的工厂?