Rust开发——Vec与Struct的使用示例

Vec是Rust的可容器,Struct是结构体,也可以当类使用,这两个是Rust开发中比较常用的两个知识点,下面例子是结合ec与Struct,对ec里的Struct结构元素进行查找、排序、筛选等操作。
拿人员登记系统来做个示例,Person有姓名、年龄,身高、体重、性别,在操作的过程中往往会要求某个成员的某个元素进行筛选或者排序,查找某个元素是否存在等。

定义一个结构体

#[derive(Debug,Clone)]
pub struct Person 
{
    
    
    name : String,  //姓名
    height : f32,   //身高
    age: u32,       //年龄
    weight : u8,    //体重
    gender : Gender,//性别
}

性别是一个枚举,因为等下要比较,enum加PartialEq这个 tauir

#[derive(Debug,Clone,PartialEq)]
pub enum Gender
{
    
    
    Male,
    Female,
}

实例化

 	let mut persons : Vec<Person> = vec![];
    persons.push(Person::new("matt".to_string(),175.2,44, 24, Gender::Female));
    persons.push(Person::new("weid".to_string(),141.1,52, 24, Gender::Male));
    persons.push(Person::new("45ma".to_string(),154.5,45,19, Gender::Female));
    persons.push(Person::new("lele".to_string(),160.5,48,21, Gender::Male));
    persons.push(Person::new("json".to_string(),159.5,48,16, Gender::Male));

筛选元素

筛选出当前列表中的所有女性

pub fn retain(persons : &Vec<Person>, gender : Gender) -> Vec<Person>
{
    
    
    let mut ret_per : Vec<Person> = persons.clone();
    ret_per.retain(|p|p.gender == gender);

    ret_per
}

输出函数

pub fn show(persons : &Vec<Person>)
{
    
    
    for elem in persons
    {
    
    
        print!("{} - {} - {} - {} - {:?} \n",
        elem.name,elem.age,elem.height,elem.weight,elem.gender);
    }
}

在这里插入图片描述

浮点数排序

按身高排序

pub fn sort_height(persons : &Vec<Person>) -> Vec<Person>
{
    
    
    let mut vec_sort : Vec<Person> = persons.clone();
    vec_sort.sort_unstable_by(|a,b|a.height.partial_cmp(&b.height).unwrap());
    vec_sort
}

在这里插入图片描述

整数排序

按年龄排序

pub fn sort_age(persons : Vec<Person>) -> Vec<Person>
{
    
    
    let mut vec_sort : Vec<Person> = persons.clone();
    vec_sort.sort_unstable_by(|a,b|a.age.cmp(&b.age));
    vec_sort
}

在这里插入图片描述

判断成员元素

判断列表里面的名字是否存在

pub fn is_exists(persons : &Vec<Person>,name : String) ->bool
{
    
    
    persons.iter().any(|p|p.name == name)
}

查找结构里的元素

按名字查找

pub fn find_elem(persons : &Vec<Person>, name : String) ->Result<Person, ()>
{
    
    
    let index = persons.partition_point(|p|p.name == name);

    if index > 0
    {
    
    
        Ok(persons[index-1].clone())
    }
    else {
    
    
        Err(())
    }
}
……………………
let person = find_elem(&peoples, "matt".to_string());

    match person {
    
    
        Ok(v) => print!("{:?} \n",v),
        Err(()) => print!("error !"),
    }

在这里插入图片描述
排序上还有按字母排序的,这个方法官方都有给了,但不适用于结构体的容器,要就用就要按官方的原函数重写一遍,也可以自己遍历之后再实现都行,但官方给的方法在运行安全与速度上更靠谱一些。

猜你喜欢

转载自blog.csdn.net/matt45m/article/details/128315514