我想从结构创建一个具有所有匹配字段id
的向量,处理该新向量,然后重复该过程。基本上将结构与匹配字段id
组合在一起。
是否可以通过不使用不稳定功能drain_filter
来做到这一点?
#![feature(drain_filter)]
#[derive(Debug)]
struct Person {
id: u32,
}
fn main() {
let mut people = vec![];
for p in 0..10 {
people.push(Person { id: p });
}
while !people.is_empty() {
let first_person_id = people.first().unwrap().id;
let drained: Vec<Person> = people.drain_filter(|p| p.id == first_person_id).collect();
println!("{:#?}", drained);
}
}
答案 0 :(得分:1)
如果您希望按人员ID对向量进行分组,则使用从id
到Vec<Person>
的HashMap可能会更有效,其中每个id
都包含一个人员向量。然后,您可以遍历HashMap并处理每个向量/组。这可能比每次迭代都消耗people
更有效,后者在最坏的情况下具有O(N ^ 2)的时间复杂度,而在HashMap中,时间复杂度为O(N)。
#![feature(drain_filter)]
use std::collections::HashMap;
#[derive(Debug)]
struct Person {
id: u32,
}
fn main() {
let mut people = vec![];
let mut groups: HashMap<u32, Vec<Person>> = HashMap::new();
for p in 0..10 {
people.push(Person { id: p });
}
people.into_iter().for_each(|person| {
let group = groups.entry(person.id).or_insert(vec![]);
group.push(person);
});
for (_id, group) in groups {
println!("{:#?}", group);
}
}