首页 > 其他分享 >rust HashMap 排序

rust HashMap 排序

时间:2023-10-11 16:01:35浏览次数:34  
标签:tmp 10 12 HashMap value key 11 排序 rust

按照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")]

标签:tmp,10,12,HashMap,value,key,11,排序,rust
From: https://www.cnblogs.com/mmtinfo/p/17757387.html

相关文章

  • pprint打印排序后的字典
    目的是为了控制台打印的好看一点打印内容为已经排序好的字典pprint不指定sort_dicts=False,会按字典的key排序测试如下frompprintimportpprintmy_dict={'d':16,'e':22,'a':16,'测试':2}sorted_dict=dict(sorted(my_dict.items(),key=lambdaitem:item[1]......
  • 归并排序 nO(lgn) 审核中
    大家好,我是蓝胖子,我一直相信编程是一门实践性的技术,其中算法也不例外,初学者可能往往对它可望而不可及,觉得很难,学了又忘,忘其实是由于没有真正搞懂算法的应用场景,所以我准备出一个系列,囊括我们在日常开发中常用的算法,并结合实际的应用场景,真正的感受算法的魅力。代码已经上传gith......
  • set通过operator <去重、排序
    如何定义类的operator<以保证set去重、有序STL自定义比较器的要求是必须为严格弱序,因为STL内部就是这样做的。x<x为假(反自反)x<y为真则y<x为假(反对称)x<y且y<z则x<z(传递性)x<y为假且y<x为假,y<z为假且z<y为假,则x<z为假且z<x为假(不可比的传递性)如果两......
  • 拓扑排序学习笔记
    拓扑排序-oiwiki在有向无环图中,若一个由该图中所有点构成的序列满足:图中所有边(x,y),x在序列A中都出现在y前,则称A是该图的一个拓扑序。求解序列A的过程就叫拓扑排序。拓扑排序可以解决一个有向无环图的所有节点排序。我理解的话,就是按每个店的入度多少的顺序找到一......
  • SQLAlchemy学习-12.查询之 order_by 按desc 降序排序
    前言sqlalchemy的query默认是按id升序进行排序的,当我们需要按某个字段降序排序,就需要用到order_by。order_by排序默认情况下sqlalchemy的query默认是按id升序进行排序的res=session.query(Project).all()print(res)#[<Project(id='1',project_name='string'.........
  • Python 常见排序:冒泡、选择、快速
    简单说明:1.冒泡排序:双层循环,交替结果2.选择排序:whilenums,假设第一个值为做小,通过for循环找到最小值以此来替换,再将nums中该值去掉继续上述步骤3.快速排序:定义一个初值,把整个数据列表分为两部分,再递归代码实现:#冒泡排序defaction1(n):foriinrange(len(n)):......
  • HashMap实现原理
       ......
  • HashMap-二叉树
        ......
  • HashMap-红黑树
       ......
  • 归并排序
    一、算法描述归并排序,是创建在归并操作上的一种有效的排序算法。算法是采用分治法的一个非常典型的应用,且各层分治递归可以同时进行。归并排序思路简单,速度仅次于快速排序,为稳定排序算法,一般用于对总体无序,但是各子项相对有序的数列。思路如下:取分界点,intmid=(l+r)/2......