结构按字段分组向量

时间:2019-11-28 07:42:20

标签: rust

我想从结构创建一个具有所有匹配字段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);
    }

}

Playground

1 个答案:

答案 0 :(得分:1)

如果您希望按人员ID对向量进行分组,则使用从idVec<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);
    }
}

Playground