let input = vec![
1, 1, 1,
98, 99,
2, 2, 2, 2,
98, 99,
3, 3
];
如何除以 [98, 99]
得到:
let output = vec![
vec![1, 1, 1],
vec![2, 2, 2, 2],
vec![3, 3],
];
目前我只找到了一次拆分 2 的方法,但我需要拆分与找到模式 [98, 99]
一样多的内容:
let sep = vec![98, 99];
let (a, b) = input.split_at(
res.windows(sep.len())
.position(|w| w == &sep)
.unwrap_or_default(),
);
有没有办法通过 stdlib 来做到这一点,而无需手动循环遍历集合?
答案 0 :(得分:0)
正如@BurntShushi5 建议的那样,使用 bstr
板条箱:
use bstr::ByteSlice;
fn main() {
let input: Vec<u8> = vec![1, 1, 1, 98, 99, 2, 2, 2, 2, 98, 99, 3, 3];
let pattern: [u8; 2] = [98, 99];
let result: Vec<Vec<u8>> = input.split_str(&pattern).map(|x|x.to_vec()).collect();
println!("{:?}", result);
}
如果您使用 (utf-8
) bytes
这可能会。
这个想法是使用 split
中的 str
方法:
fn main() {
let input: Vec<u8> = vec![1, 1, 1, 98, 99, 2, 2, 2, 2, 98, 99, 3, 3];
let s = std::str::from_utf8(&input).unwrap();
let pattern = std::str::from_utf8(&[98, 99]).unwrap();
let new_vector: Vec<Vec<u8>> = s.split(pattern).map(|s| s.as_bytes().to_vec()).collect();
println!("{:?}", new_vector);
}
答案 1 :(得分:0)
AFAIK 在标准库中没有 split
函数用于字节切片(或除字符串之外的任何其他内容)。但是,您可以让 stdlib 使用 fold
为您处理循环:
let input = vec![
1, 1, 1,
98, 99,
2, 2, 2, 2,
98, 99,
3, 3
];
let sep = vec![ 98, 99 ];
let acc = input.iter().fold (
(vec![], vec![], 0),
|(mut res, mut cur, count), &val| {
if val == sep[count] {
if count+1 == sep.len() {
res.push (cur);
(res, vec![], 0)
} else {
(res, cur, count+1)
}
} else if count != 0 {
cur.extend_from_slice (&sep[..count]);
(res, cur, 0)
} else {
cur.push (val);
(res, cur, 0)
}
});
let mut output = acc.0;
if !acc.1.is_empty() { output.push (acc.1); }
这也可以适用于引用,从而不需要输入来实现 Copy
:
let acc = input.iter().enumerate().fold (
(vec![], 0, 0, 0),
|(mut res, beg, end, count), (cur, val)| {
if val == &sep[count] {
if count+1 == sep.len() {
res.push (&input[beg..end]);
(res, cur+1, cur+1, 0)
} else {
(res, beg, end, count+1)
}
} else {
(res, beg, cur+1, 0)
}
});
let mut output = acc.0;
if acc.1 < acc.2 { output.push (&input[acc.1 .. acc.2]); }
请注意,第二个版本的输出是切片的向量,而不是向量的向量。