分组字符串向量

时间:2016-07-08 19:25:59

标签: rust

我试图将长度不均匀的字符串向量组合成偶数长度字符串的向量。我能想到的最懒的方法是将参数连接到一个字符串中,将字符转换为一个向量,然后使用Vec::chunks。不幸的是,我遇到了试图将块收集到字符串中的问题。

let args: Vec<String> = ["123", "4", "56"].iter().map(|&s| s.into()).collect();

let result: Vec<String> = args
    .join(" ")
    .chars()
    .collect::<Vec<_>>()
    .chunks(2)
    .map(|c| c.collect::<String>())
    .collect::<Vec<String>>();

assert_eq!(["12", "34", "56"], result);

导致错误:

error[E0599]: no method named `collect` found for type `&[char]` in the current scope
 --> src/main.rs:9:20
  |
9 |         .map(|c| c.collect::<String>())
  |                    ^^^^^^^
  |
  = note: the method `collect` exists but the following trait bounds were not satisfied:
          `&mut &[char] : std::iter::Iterator`
          `&mut [char] : std::iter::Iterator`

1 个答案:

答案 0 :(得分:5)

你离我很远:

let result: Vec<String> = args
    .join("")
    .chars()
    .collect::<Vec<_>>()
    .chunks(2)
    .map(|x| x.iter().cloned().collect())
    .collect();

println!("{:?}", result);
  1. 将他们加在一起时,你可能不想要一个空间。

  2. 您需要通过&[char]将每个块(.iter())转换为迭代器。然后,您必须通过&char将迭代类型从char转换为.cloned()

  3. 我可以使用Itertools::chunks来写这个:

    use itertools::Itertools; // 0.8.0
    
    fn main() {
        let args = ["123", "4", "56"];
    
        let together = args.iter().flat_map(|x| x.chars());
    
        let result: Vec<String> = together
            .chunks(2)
            .into_iter()
            .map(|x| x.collect())
            .collect();
    
        println!("{:?}", result);
    }
    

    flat_map避免了创建String的需要,只是将一个迭代器链接到下一个迭代器。

    Itertools::chunks允许程序员不创建中间Vec。相反,它有一个内部向量,IIRC,在产生一个值之前,它只会在其中存储最多n个值。这样你就可以缓冲少量的物品。