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 !"),
}
排序上还有按字母排序的,这个方法官方都有给了,但不适用于结构体的容器,要就用就要按官方的原函数重写一遍,也可以自己遍历之后再实现都行,但官方给的方法在运行安全与速度上更靠谱一些。