我想计算一个字符串中每个字母的出现次数。目的是建立一个HashMap<char,i32>
键,键是字符串中的所有字符,值是出现次数。
假设我正在遍历char
字符串或输入文件中的值。对于每一个char
,如果还没有遇到过,我需要将其添加到HashMap
与值1新的密钥,但如果它已经被先前看到的,我需要增加的价值。
这是有效的代码。忍受我,我对Rust很陌生:
use std::collections::HashMap;
fn main() {
let mut letter_counts: HashMap<char,i32> = HashMap::new();
let input_string = "Hello, world!";
let char_vec: Vec<char> = input_string.to_lowercase().chars().collect();
for c in char_vec {
if let Some(x) = letter_counts.get_mut(&c) {
*x = *x + 1;
} else {
letter_counts.insert(c,1);
}
}
println!("{:?}",letter_counts);
}
我想知道的是,Rust是否有惯用的方法来做到这一点?习惯用语,我的意思是说,有一种标准的库类型(如Python的defaultdict
),或HashMap上的方法(如Java的HashMap.computeIfAbsent
),它比我手工编码该算法更简单,更清晰和/或更少出错。 ?
如果使用以下Entry
界面,这可能会使您想做的事情更容易些,或者有些惯用语:
use std::collections::HashMap;
fn main() {
let mut letter_counts: HashMap<char,i32> = HashMap::new();
let input_string = "Hello, world!";
let char_vec: Vec<char> = input_string.to_lowercase().chars().collect();
for c in char_vec {
*letter_counts.entry(c).or_insert(0) += 1;
}
println!("{:?}",letter_counts);
}
这样,您就可以创建不存在的条目,并同时对其进行修改。
如果您想要更多功能,可以执行以下操作:
use std::collections::HashMap;
fn main() {
let input_string = "Hello, world!";
let letter_counts: HashMap<char, i32> =
input_string
.to_lowercase()
.chars()
.fold(HashMap::new(), |mut map, c| {
*map.entry(c).or_insert(0) += 1;
map
});
println!("{:?}", letter_counts);
}
这使用折叠来累积物品。
如果您正在寻找一种标准的库函数来计算某项的出现频率,那么就没有了。功能方法足够优雅,以至于我个人并不认为这是一个错误,这是我在这种情况下通常用于大多数普通的惯用Rust代码的方法。在Rust中,使用迭代器非常普遍。
正如其他人所提到的,对于某些情况,当然还有一些更专业的替代方法。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句