我能够有效地解析我的输入Iterator<Iterator<i32>>
,其中每个内部迭代器的长度为2.输入如下:
0: 3
1: 2
2: 4
4: 8
6: 5
8: 6
...
我可以用以下方法解析:
input.lines()
.map(|line| line.split(": ")
.filter_map(|n| n.parse::<i32>().ok()))
我想出的最好的方法是将其放入HashMap
:
let mut tmp_map: HashMap<i32, i32> = HashMap::new();
for mut pair in input.lines()
.map(|line| line.split(": ")
.filter_map(|n| n.parse::<i32>().ok()))
{
tmp_map.insert(pair.next().unwrap(), pair.next().unwrap());
}
......这看起来非常笨拙。有没有办法将这个迭代器收集到HashMap
?
答案 0 :(得分:5)
HashMap
实施FromIterator<(K, V)>
。然后,只需将文本转换为元组的迭代器即可。我喜欢使用Itertools::tuples
:
const INPUT: &str = r#"0: 3
1: 2
2: 4
4: 8
6: 5
8: 6"#;
extern crate itertools;
use std::collections::HashMap;
use itertools::Itertools;
fn main() {
let z: HashMap<u8, u8> = INPUT
.lines()
.flat_map(|l| l.split(":"))
.flat_map(|n| n.trim().parse())
.tuples()
.collect();
println!("{:?}", z);
}
另见: