有没有办法在Rust中一次将多个条目插入HashMap?

fir*_*ant 4 hashmap rust

有没有办法在Rust中一次将多个条目插入HashMap?或者用多个条目初始化它?除了手动调用insert您插入的每个元素之外的任何其他内容?

编辑使用英文字母频率的示例:

我基本上想要:

let frequencies = { 
  'a': 0.08167, 
  'b': 0.01492, 
  ... 
  'z': 0.00074 
}
Run Code Online (Sandbox Code Playgroud)

我知道我可以通过执行类似下面的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]);
}
Run Code Online (Sandbox Code Playgroud)

对于一个文字,我可以使用这里的答案,这可能适用于这个例子,但我很好奇是否有一种方法可以做到这一点,如果它是一个文字,以防将来出现.

Art*_*mGr 12

有没有办法在Rust中一次将多个条目插入HashMap?

是的,您可以使用extenda 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}.
}
Run Code Online (Sandbox Code Playgroud)

它甚至比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}.
}
Run Code Online (Sandbox Code Playgroud)
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}.
}
Run Code Online (Sandbox Code Playgroud)
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}.
}
Run Code Online (Sandbox Code Playgroud)