有什么办法可以在Rust中一次将多个条目插入到HashMap中?还是用多个条目初始化它?除了手动调用insert
要插入的每个元素之外,还有其他功能吗?
使用英文字母频率编辑示例:
我基本上想要:
let frequencies = {
'a': 0.08167,
'b': 0.01492,
...
'z': 0.00074
}
我知道我可以通过执行如下所示的for循环来达到相同的结果,但是我想知道是否有一种方法可以执行此操作而无需创建其他数组,然后遍历它们,或者通常使用更优雅的解决方案。
let mut frequencies = HashMap::new();
let letters = ['a','b','c', ...... 'z'];
let freqs = [0.08167, 0.01492, 0.02782, ......., 0.00074];
for i in 0..26 {
frequencies.insert(letters[i], freqs[i]);
}
对于文字,我可以在这里使用答案,该答案在本示例中可能会很好地工作,但是我很好奇是否有一种方法可以不使用文字,以防将来出现这种情况。
有什么办法可以在Rust中一次将多个条目插入到HashMap中?
是的,你可以extend
一个HashMap
与来自值Iterator
,如下所示:
use std::collections::HashMap;
fn main() {
let mut map = HashMap::new();
map.extend((1..3).map(|n| (format!("{}*2=", n), n * 2)));
map.extend((7..9).map(|n| (format!("{}*2=", n), n * 2)));
println!("{:?}", map); // Prints {"1*2=": 2, "8*2=": 16, "7*2=": 14, "2*2=": 4}.
}
它甚至比insert
手动调用要快一点,因为extend
使用Iterator
预先提供的大小提示来保留一些空间。
在map.rs中查看此方法的源代码。
还是用多个条目初始化它?
由于HashMap
实现了FromIterator
特性,这也是可能的。当实现collection时FromIterator
,可以使用Iterator::collect
速记来构造它。考虑以下示例,所有示例均生成相同的地图:
use std::collections::HashMap;
fn main() {
let mut map: HashMap<_, _> = (1..3).map(|n| (format!("{}*2=", n), n * 2)).collect();
map.extend((7..9).map(|n| (format!("{}*2=", n), n * 2)));
println!("{:?}", map); // Prints {"1*2=": 2, "8*2=": 16, "7*2=": 14, "2*2=": 4}.
}
use std::collections::HashMap;
fn main() {
let map: HashMap<_, _> = (1..3)
.chain(7..9)
.map(|n| (format!("{}*2=", n), n * 2))
.collect();
println!("{:?}", map); // Prints {"1*2=": 2, "8*2=": 16, "7*2=": 14, "2*2=": 4}.
}
use std::collections::HashMap;
use std::iter::FromIterator;
fn main() {
let iter = (1..3).chain(7..9).map(|n| (format!("{}*2=", n), n * 2));
let map = HashMap::<String, u32>::from_iter(iter);
println!("{:?}", map); // Prints {"1*2=": 2, "8*2=": 16, "7*2=": 14, "2*2=": 4}.
}
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句