将长度为2的迭代器收集到HashMap中

时间:2017-12-13 21:42:04

标签: rust

我能够有效地解析我的输入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

Playground

1 个答案:

答案 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);
}

另见: