rust HashMap 排序
按照key和value升序、降序、自定义排序示例
use std::collections::HashMap;
use std::cmp::Ordering;
fn main() {
let mut df = HashMap::new();
for x in 5..=12 {
let k = format!("key_{}",x);
let v = format!("value_{}",x);
df.insert(k,v);
}
println!("{:#?}",df);
let mut tmp : Vec<(&String, &String)>= df.iter().collect();
// 按照key排序
tmp.sort_by_key(|x| x.0); // 升序 eq => tmp.sort_by(|x,y| x.0.cmp(y.0));
println!("key up:\t{:?}",tmp);
tmp.sort_by(|x,y| y.0.cmp(x.0)); // 降序
println!("key down:\t{:?}",tmp);
// 按照value排序
tmp.sort_by(|x,y|x.1.cmp(y.1)); // 升序
println!("value up:\t{:?}",tmp);
tmp.sort_by(|x,y|y.1.cmp(x.1)); // 降序
println!("value down:\t{:?}",tmp);
// 人类习惯的方式排序
tmp.sort_by(|x,y| myorder(x.0,y.0)); // key 升序
println!("key up:\t{:?}",tmp);
tmp.sort_by(|x,y| myorder(y.0,x.0)); // key 降序
println!("key down:\t{:?}",tmp);
tmp.sort_by(|x,y| myorder(x.1,y.1)); // value升序
println!("value up:\t{:?}",tmp);
tmp.sort_by(|x,y| myorder(y.1,x.1)); // value 降序
println!("value down:\t{:?}",tmp);
}
fn myorder(a: &String, b: &String) -> Ordering {
// split_mix: 返回混合字符串的字符和数字部分
let (p1,n1) = split_mix(a);
let (p2,n2) = split_mix(b);
match p1.cmp(&p2) {
Ordering::Less => Ordering::Less,
Ordering::Greater => Ordering::Greater,
Ordering::Equal => n1.cmp(&n2) //字符串相同时继续比较数字部分
}
}
fn split_mix(k: &String) -> (String, u32){
let num: String = k.chars().filter(|x| x.is_digit(10)).collect();
let strs: String = k.chars().filter(|x| !x.is_digit(10)).collect();
(strs ,num.parse().unwrap())
}
输出:
{
"key_12": "value_12",
"key_5": "value_5",
"key_11": "value_11",
"key_7": "value_7",
"key_9": "value_9",
"key_8": "value_8",
"key_10": "value_10",
"key_6": "value_6",
}
key up: [("key_10", "value_10"), ("key_11", "value_11"), ("key_12", "value_12"), ("key_5", "value_5"), ("key_6", "value_6"), ("key_7", "value_7"), ("key_8", "value_8"), ("key_9", "value_9")]
key down: [("key_9", "value_9"), ("key_8", "value_8"), ("key_7", "value_7"), ("key_6", "value_6"), ("key_5", "value_5"), ("key_12", "value_12"), ("key_11", "value_11"), ("key_10", "value_10")]
value up: [("key_10", "value_10"), ("key_11", "value_11"), ("key_12", "value_12"), ("key_5", "value_5"), ("key_6", "value_6"), ("key_7", "value_7"), ("key_8", "value_8"), ("key_9", "value_9")]
value down: [("key_9", "value_9"), ("key_8", "value_8"), ("key_7", "value_7"), ("key_6", "value_6"), ("key_5", "value_5"), ("key_12", "value_12"), ("key_11", "value_11"), ("key_10", "value_10")]
key up: [("key_5", "value_5"), ("key_6", "value_6"), ("key_7", "value_7"), ("key_8", "value_8"), ("key_9", "value_9"), ("key_10", "value_10"), ("key_11", "value_11"), ("key_12", "value_12")]
key down: [("key_12", "value_12"), ("key_11", "value_11"), ("key_10", "value_10"), ("key_9", "value_9"), ("key_8", "value_8"), ("key_7", "value_7"), ("key_6", "value_6"), ("key_5", "value_5")]
value up: [("key_5", "value_5"), ("key_6", "value_6"), ("key_7", "value_7"), ("key_8", "value_8"), ("key_9", "value_9"), ("key_10", "value_10"), ("key_11", "value_11"), ("key_12", "value_12")]
value down: [("key_12", "value_12"), ("key_11", "value_11"), ("key_10", "value_10"), ("key_9", "value_9"), ("key_8", "value_8"), ("key_7", "value_7"), ("key_6", "value_6"), ("key_5", "value_5")]
作者:天使不设防
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利.