通过字段分割矢量,保持顺序



在Rust中,有一种简单的方法可以拆分这样的向量:

let original_vec = vec![
(14, "Foo", 62.3),
(17, "Foo", 77.8),
(25, "Bar", 33.7),
(27, "Bar", 99.2),
(61, "Foo", 17.4),
(64, "Bar", 55.5),
(77, "Bar", 31.2),
];

进入这个:

let res = vec![
vec![
(14, "Foo", 62.3),
(17, "Foo", 77.8),
],
vec![
(25, "Bar", 33.7),
(27, "Bar", 99.2),
],
vec![
(61, "Foo", 17.4),  // "Foo" again
],
vec![
(61, "Bar", 55.5),  // A separate group of "Bars"
(77, "Bar", 31.2),
],
]

只是澄清一下:我想把我的输入向量除以它元素中的一个字段。只有具有相同字段值的连续元素才能放入子向量中。";扁平的";结果向量必须与原始向量具有相同的顺序。

我找到了我想要的东西:

original_vec.group_by(|a, b| a.1 == b.1)

然而,group_by方法在撰写本文时仅在Nightly中可用,并且需要添加:

#![feature(slice_group_by)]

作为替代方案,正如Sebastian所建议的,可以使用itertools机箱中的group_by()

基本上我想象以下解决方案

let original_vec = vec![
(14, "Foo", 62.3),
(17, "Foo", 77.8),
(25, "Bar", 33.7),
(27, "Bar", 99.2),
(61, "Foo", 17.4),
(64, "Bar", 55.5),
(77, "Bar", 31.2),
];

type DATA = (i32, &'static str, f32);
let mut t: Vec<Vec<DATA>> = Vec::new();
let mut q: Vec<DATA> = Vec::new();
let mut p: DATA = (0, "", 0.0);
for i in original_vec
{
if i.1 != p.1 && p.1 != "" {
t.push(q);
q = Vec::new();    
q.push(i);
}

q.push(i);
p = i;
}
println!("{:?}", t);

最新更新