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

时间:2017-06-15 19:23:19

标签: hashmap rust

有没有办法在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]);
}

对于文字,我可以使用答案here,这可能适用于这个例子,但我很好奇是否有一种方法可以做到这一点而不是文字,如果将来出现这种情况。

1 个答案:

答案 0 :(得分:10)

  

有没有办法在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提供的大小提示,以便事先预留一些空间。

查看方法here, in 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::<String, u32>::from_iter(iter);
    println!("{:?}", map); // Prints {"1*2=": 2, "8*2=": 16, "7*2=": 14, "2*2=": 4}.
}