分块字符串向量

Nic*_*lin 0 rust

我正在尝试将长度不均匀的字符串的向量分块为长度相等的字符串的向量。我想到的最懒惰的方法是将参数连接到字符串中,将chars转换为向量,然后使用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);
Run Code Online (Sandbox Code Playgroud)

结果错误:

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);
Run Code Online (Sandbox Code Playgroud)

She*_*ter 5

您距离不远:

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

println!("{:?}", result);
Run Code Online (Sandbox Code Playgroud)
  1. 将它们连接在一起时,您可能不希望有空格。

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


我可能会这样写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);
}
Run Code Online (Sandbox Code Playgroud)

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

Itertools::chunks允许程序员不创建中间体Vec。取而代之的是,它具有一个内部向量IIRC,n在产生一个值之前,它只会在其中存储最多值。这样,您可以缓冲较少的项目。