2015-02-08 13 views
15

Tôi đang sử dụng một HashMap để đếm số lần xuất hiện của các nhân vật khác nhau trong một chuỗi:More súc tích HashMap khởi

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 =>(), 
    } 
} 

Có cách nào ngắn gọn hơn hoặc khai báo để khởi tạo một HashMap? Ví dụ trong Python tôi sẽ làm:

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

hoặc

counts = { key: 0 for key in 'ACGT' } 
+0

thể trùng lặp của [Làm thế nào để tạo ra một HashMap đen?] (Http://stackoverflow.com/questions/27582739/how-do-i-create-a-hashmap-literal) – Shepmaster

+0

Đồng ý. Tôi nên tìm kiếm "chữ". – anderspitman

Trả lời

29

Bạn có thể sử dụng vòng lặp để bắt chước các hiểu từ điển, ví dụ

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

hoặc thậm chí for c in "ACGT".chars() { counts.insert(c, 0) }.

Ngoài ra, người ta có thể viết macro để cho phép khởi tạo ngắn gọn các giá trị tùy ý.

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

được sử dụng như let counts = hashmap!['A' => 0, 'C' => 0, 'G' => 0, 'T' => 0];.

+13

R shouldNG chắc chắn sẽ ở trong std! –

+0

Tuyệt vời, cảm ơn bạn. – anderspitman

Các vấn đề liên quan