我试图将长度不均匀的字符串向量组合成偶数长度字符串的向量。我能想到的最懒的方法是将参数连接到一个字符串中,将字符转换为一个向量,然后使用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`
答案 0 :(得分:5)
你离我很远:
let result: Vec<String> = args
.join("")
.chars()
.collect::<Vec<_>>()
.chunks(2)
.map(|x| x.iter().cloned().collect())
.collect();
println!("{:?}", result);
将他们加在一起时,你可能不想要一个空间。
您需要通过&[char]
将每个块(.iter()
)转换为迭代器。然后,您必须通过&char
将迭代类型从char
转换为.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);
}
flat_map
避免了创建String
的需要,只是将一个迭代器链接到下一个迭代器。
Itertools::chunks
允许程序员不创建中间Vec
。相反,它有一个内部向量,IIRC,在产生一个值之前,它只会在其中存储最多n
个值。这样你就可以缓冲少量的物品。