#map #sort-map #sort-by-value

nightly valord-map

按值排序的字典

12个版本 (破坏性)

0.10.0 2024年6月18日
0.8.0 2024年6月3日

#512 in 算法

每月下载量36

MIT许可

40KB
563

Valord Map

概述

按值排序的字典。

您可以直接根据您的数据结构进行排序,或者实现OrdBy来指定基于特定字段的排序。

Crates.io docs.rs MIT licensed

方法

示例

use valord_map::{OrdBy, ValordMap};

#[derive(Debug, PartialEq)]
struct People {
    age: u8,
    name: String,
}

impl OrdBy for People {
    type Target = u8;

    fn ord_by<'a>(&'a self) -> Self::Target {
        self.age
    }
}

let mut peoples = ValordMap::new();
peoples.insert(
    1,
    People {
        age: 18,
        name: "qians1".to_string(),
    },
);
peoples.insert(
    2,
    People {
        age: 19,
        name: "qians2".to_string(),
    },
);
peoples.insert(
    3,
    People {
        age: 20,
        name: "qians3".to_string(),
    },
);
peoples.insert(
    4,
    People {
        age: 21,
        name: "qians4".to_string(),
    },
);
peoples.insert(
    5,
    People {
        age: 22,
        name: "qians5".to_string(),
    },
);

let youngest = peoples.first();
assert_eq!(youngest.len(), 1);
assert_eq!(
    youngest[0],
    (
        &1,
        &People {
            age: 18,
            name: "qians1".to_string(),
        }
    )
);

let oldest = peoples.last();
assert_eq!(oldest.len(), 1);
assert_eq!(
    oldest[0],
    (
        &5,
        &People {
            age: 22,
            name: "qians5".to_string(),
        }
    )
);

peoples
    .iter_mut()
    .for_each(|mut people_ref_mut| people_ref_mut.age += 1);

let youngest = peoples.first();
assert_eq!(youngest.len(), 1);
assert_eq!(
    youngest[0],
    (
        &1,
        &People {
            age: 19,
            name: "qians1".to_string(),
        }
    )
);

let oldest = peoples.last();
assert_eq!(oldest.len(), 1);
assert_eq!(
    oldest[0],
    (
        &5,
        &People {
            age: 23,
            name: "qians5".to_string(),
        }
    )
);

let range: Vec<_> = peoples.range(22..).collect();
assert_eq!(range.len(), 2);
println!("range: {range:?}");

let range: Vec<_> = peoples
    .range_mut(22..)
    .map(|mut rm_p| {
        let (k, v) = rm_p.get_mut_with_key();
        v.age = 30;
        (k.clone(), v.name.clone(), v.age)
    })
    .collect();

println!("range mut: {range:?}");

let oldest = peoples.last();
assert_eq!(oldest.len(), 2);
assert_eq!(oldest[0].1.age, 30);
assert_eq!(oldest[1].1.age, 30);
println!("peoples: {:?}", peoples.iter().collect::<Vec<_>>());

依赖

~1MB
~14K SLoC