作者:boybeta | 来源:互联网 | 2023-02-01 10:23
有没有办法在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]);
}
对于一个文字,我可以使用这里的答案,这可能适用于这个例子,但我很好奇是否有一种方法可以做到这一点,如果它是一个文字,以防将来出现.
1> ArtemGr..:
有没有办法在Rust中一次将多个条目插入HashMap?
是的,您可以使用extend
a 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
特性,这也是可能的.当集合实现时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::::from_iter(iter);
println!("{:?}", map); // Prints {"1*2=": 2, "8*2=": 16, "7*2=": 14, "2*2=": 4}.
}