2015-02-08 55 views
15

我使用HashMap計算不同人物的出現在一個字符串:更簡潔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' } 
+0

可能重複[如何創建HashMap文字?](http://stackoverflow.com/questions/27582739/how-do-i-create-a-hashmap-literal) – Shepmaster 2015-02-08 15:03:52

+0

同意。我應該搜索「文字」。 – anderspitman 2015-02-08 19:57:50

回答

29

可以使用迭代器來模擬字典理解,例如

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];一樣使用。

+13

這絕對應該是std! – 2015-02-08 19:06:47

+0

非常好,謝謝。 – anderspitman 2015-02-08 19:58:12