2015-02-08 5 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 प्रारंभ करने में अधिक संक्षिप्त या कथात्मक तरीका है? अजगर में उदाहरण के लिए मुझे क्या करना होगा:

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

या

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

संभावित डुप्लिकेट [मैं हैश मैप शाब्दिक कैसे बना सकता हूं?] (Http://stackoverflow.com/questions/27582739/how-do-i-create-a-hashmap-literal) – Shepmaster

+0

सहमत हैं। मुझे "शाब्दिक" खोजना चाहिए था। – anderspitman

उत्तर

29

आप समझ शब्दकोश अनुकरण करने के लिए, उदाहरण के लिए उपयोग कर सकते हैं iterators

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 में होना चाहिए! –

+0

उत्कृष्ट, धन्यवाद। – anderspitman

संबंधित मुद्दे