gpt4 book ai didi

rust - 按值对 HashMap 数据进行排序

转载 作者:行者123 更新时间:2023-11-29 07:40:37 24 4
gpt4 key购买 nike

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

我正在尝试做的 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())?这会更像惯用语吗?

最佳答案

Is this idiomatic Rust?

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

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

根据上下文不难弄清楚 count_vec 的完整类型是什么。您可以省略count 的类型约束完全,但是您必须使用整型字面量来玩恶作剧才能获得正确的值类型推断。也就是说,在这种情况下显式注释是非常合理的。

其他您可以如果您愿意做出的临界变化是使用|a, b| a.1.cmp(b.1).reverse() 用于排序闭包。 Ordering::reverse 方法只是反转结果,使小于变为大于,反之亦然。这使得您意思您所写的内容更加明显,而不是不小心调换了两个字母。

Can I construct the count_vec in a way so that it would consume the HashMaps data and owns it?

没有任何意义。仅仅因为 HashMap 使用内存并不意味着内存在任何方面都与 Vec 兼容。您可以使用 count.into_iter()消费 HashMap 并将元素移出(而不是遍历指针),但由于两者charu32 可以轻松复制,这对您没有任何好处。

关于rust - 按值对 HashMap 数据进行排序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34555837/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com