Rust の HashMap は FromIterator
なので, キー (K
) と値 (V
) のタプル (K, V)
を返すイテレータを直接 .collect
して生成することができます. これは HashMap の .into_iter
の逆操作になっていると言ってもよいです.
具体例として 言語処理100本ノック から「04. 元素記号」を解いてみます.
use std::collections::HashMap;
const ONE_CHAR: &[usize] = &[ 0, 4, 5, 6, 7, 8, 14, 15, 18 ];
const TEXT: &str = "Hi He Lied Because Boron Could Not Oxidize Fluorine. \
New Nations Might Also Sign Peace Security Clause. Arthur King Can";
fn main() {
let elements: HashMap<&str, usize> = TEXT.split_whitespace()
.enumerate()
.map(|(i, text)| {
if ONE_CHAR.contains(&i) {
(&text[0..1], i+1)
} else {
(&text[0..2], i+1)
}
}).collect();
println!("{:?}", elements);
}
{"C": 6, "Be": 4, "P": 15, "F": 9, "Al": 13, "Si": 14, "Ne": 10, "Na": 11, "N": 7, "Mi": 12, "Li": 3, "B": 5, "He": 2, "S": 16, "Ar": 18, "H": 1, "K": 19, "Cl": 17, "O": 8, "Ca": 20}
のような出力 (順不同) が得られるはずです. それにしてもこの問題, "Mg"
じゃないのとても落ち着かないのですが...