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

7kqas0il  于 2022-12-26  发布在  其他
关注(0)|答案(2)|浏览(144)

在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,这在本例中可能会很好,但我很好奇是否有一种方法可以在不使用字面量的情况下做到这一点,以防将来出现这种情况。

hk8txs48

hk8txs481#

在Rust中有没有办法一次将多个条目插入到一个HashMap中?
是的,您可以使用Iterator中的值对HashMap执行extend操作,如下所示:

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 trait,这也是可能的。当集合实现FromIterator时,您可以使用Iterator::collect简写来构造它。考虑以下示例,所有这些示例都生成相同的Map:
x一个一个一个一个x一个一个二个一个x一个一个三个一个

kpbwa7wx

kpbwa7wx2#

use std::collections::HashMap;

fn main() {
    let pairs = [
        ("a", 1),
        ("b", 2),
        ("c", 3),
        ("z", 50),
    ];

    println!("1. Insert multiple entries into a HashMap at once");
    let mut map = HashMap::new();
    map.extend(pairs);
    println!("map: {map:#?}\n");
    
    println!("2. Initialize with multiple entries");
    let map = HashMap::from([
        ("a", 1),
        ("b", 2),
        ("c", 3),
        ("z", 50),
    ]);
    println!("map: {map:#?}\n");

    println!("3. Initialize with multiple entries");
    let map = HashMap::from(pairs);
    println!("map: {map:#?}\n");
    
    println!("4. Initialize with multiple entries");
    let map: HashMap<_, _> = pairs.into();
    println!("map: {map:#?}");
}

请参见Rust Playground

相关问题