更简洁的HashMap初始化

问题描述 投票:25回答:2

我正在使用HashMap来计算字符串中不同字符的出现:

let text = "GATTACA";
let mut counts: HashMap<char, i32> = HashMap::new();
counts.insert('A', 0);
counts.insert('C', 0);
counts.insert('G', 0);
counts.insert('T', 0);

for c in text.chars() {
    match counts.get_mut(&c) {
        Some(x) => *x += 1,
        None => (),
    }
}

是否有更简洁或声明性的方法来初始化HashMap?例如,在Python中,我会这样做:

counts = { 'A': 0, 'C': 0, 'G': 0, 'T': 0 }

counts = { key: 0 for key in 'ACGT' }
rust
2个回答
42
投票

例如,您可以使用迭代器来模拟字典理解。>

let counts = "ACGT".chars().map(|c| (c, 0_i32)).collect::<HashMap<_, _>>();

甚至for c in "ACGT".chars() { counts.insert(c, 0) }

此外,可以编写宏以允许任意值的简洁初始化。

macro_rules! hashmap {
    ($( $key: expr => $val: expr ),*) => {{
         let mut map = ::std::collections::HashMap::new();
         $( map.insert($key, $val); )*
         map
    }}
}

let counts = hashmap!['A' => 0, 'C' => 0, 'G' => 0, 'T' => 0];相似。


0
投票

我在官方文档中看到的另一种方式:https://doc.rust-lang.org/std/collections/struct.HashMap.html

© www.soinside.com 2019 - 2024. All rights reserved.