HashMap两种排序方法源码解析

HashMap中红黑树的排序方式 我们通常知道当hashmap链表长度超过8的时候 链表会转换为红黑树 以提高查询的效率 由红黑树的定义可知 红黑树是一颗二叉搜索树 中序遍历会是有序的 那么HashMap中红黑树的排序方式是按照那种规则排序的呢? 答案在源码的 treeify方法中有说明 else if ((kc == null &&(kc = comparableClassFor(k)) == null) ... 阅读详情

此文章主要介绍了Java HashMap两种简便排序方法解析,需要的朋友可以参考下。

HashMap的储存是没有顺序的,而是按照key的HashCode实现。

key=手机品牌,value=价格,这里以这个例子实现按名称排序和按价格排序。

1.创建一个简单的HashMap

	Map phone=new HashMap();
    phone.put("Apple",8899);
    phone.put("SAMSUNG",7000);
    phone.put("Meizu",2698);
    phone.put("Xiaomi",1800);
    phone.put("Xiaomi",1800);
    System.out.println(phone);

如果直接输出HashMap得到的是一个无序Map(不是Arraylist那种顺序型储存)。

2.按key排序

对名称进行排序,首先要得到HashMap中键的集合(keySet),并转换为数组,这样才能用Arrays.sort()进行排序

	Set set=phone.keySet();
    Object[] arr=set.toArray();
    Arrays.sort(arr);
    for(Object key:arr){
      System.out.println(key);
    }

得到排序好的键值:

最后利用HashMap.get(key)得到键对应的值即可:

for(Object key:arr){
  System.out.println(key+": "+phone.get(key));
}

得到的打印的结果: 见最下方

3.按value排序

对价格进行排序,首先需要得到HashMap中的包含映射关系的视图(entrySet),

将entrySet转换为List,然后重写比较器比较即可.这里可以使用List.sort(comparator),也可以使用Collections.sort(list,comparator)。

转换为list:

 List<Map.Entry<String, Integer>> list = new ArrayList<Map.Entry<String, Integer>>(phone.entrySet()); //转换为list
3.1 使用list.sort()排序
list.sort(new Comparator<Map.Entry<String, Integer>>() {
     @Override
     public int compare(Map.Entry<String, Integer> o1, Map.Entry<String, Integer> o2) {
       return o2.getValue().compareTo(o1.getValue());
     }
   });
3.2 使用Collections.sort()排序
Collections.sort(list, new Comparator<Map.Entry<String, Integer>>() {
      @Override
      public int compare(Map.Entry<String, Integer> o1, Map.Entry<String, Integer> o2) {
        return o2.getValue().compareTo(o1.getValue());
      }
    });
3.3 两种方式结果输出
//for循环
     for (int i = 0; i < list.size(); i++) {
      System.out.println(list.get(i).getKey() + ": " + list.get(i).getValue());
    }   
 //for-each循环
      for (Map.Entry<String, Integer> mapping : list){
      System.out.println(mapping.getKey()+": "+mapping.getValue());
    }
3.4 遍历打印输出
	//for
    for (int i = 0; i < list.size(); i++) {
      System.out.println(list.get(i).getKey() + ": " +list.get(i).getValue());
    }
    System.out.println();
    //for-each
    for (Map.Entry<String, Integer> mapping : list) {
      System.out.println(mapping.getKey() + ": " +mapping.getValue());
    }

4.完整源码

package com.raisecom.tiap.ems.basic.mgt.controller.wdm.semiactive;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.Comparator;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Set;

/**
 * @author yangl-006305
 * @version V1.0
 * @date 2020-08-04 20:35
 */
public class SortHashMap {

    public static void main(String[] args) {
        //实现按名称排序和按价格排序
        Map phone = new HashMap();
        phone.put("Apple", 8899);
        phone.put("Xiaomi", 1800);
        phone.put("Vivo", 3200);
        phone.put("HTC", 1499);
        phone.put("SAMSUNG", 7000);
        phone.put("Meizu", 2698);
        phone.put("HuaWei", 3499);

        System.out.println(phone);
        System.out.println("@@@@@@@@@@@");

        //1.按key排序
        Set set = phone.keySet();
        Object[] arr = set.toArray();
        Arrays.sort(arr);
        for (Object key : arr) {
            System.out.println(key + ": " + phone.get(key));
        }
        System.out.println("----------------");
        //2.按value排序

        //转换为list
        List<Map.Entry<String, Integer>> list = new ArrayList<Map.Entry<String, Integer>>(phone.entrySet()); //转换为list
        //使用list.sort()排序
        list.sort(new Comparator<Map.Entry<String, Integer>>() {
            @Override
            public int compare(Map.Entry<String, Integer> o1, Map.Entry<String, Integer> o2) {
                return o2.getValue().compareTo(o1.getValue());
            }
        });

        //使用Collections.sort()排序
        Collections.sort(list, new Comparator<Map.Entry<String, Integer>>() {
            @Override
            public int compare(Map.Entry<String, Integer> o1, Map.Entry<String, Integer> o2) {
                return o2.getValue().compareTo(o1.getValue());
            }
        });

        //两种方式结果输出
        //1.for循环
        for (int i = 0; i < list.size(); i++) {
            System.out.println(list.get(i).getKey() + ": " + list.get(i).getValue());
        }
        System.out.println("+++++++++++++");


        //2.for-each循环
        for (Map.Entry<String, Integer> mapping : list) {
            System.out.println(mapping.getKey() + ": " + mapping.getValue());
        }
        System.out.println("***************");

        //list倒序输出
        Collections.reverse(list);
        for (int j = 0; j < list.size(); j++) {
            System.out.println(list.get(j).getKey() + ": " + list.get(j).getValue());
        }
    }
}

5.完整源码输出结果

{Meizu=2698, Apple=8899, Xiaomi=1800, Vivo=3200, HTC=1499, HuaWei=3499, SAMSUNG=7000}
@@@@@@@@@@@
Apple: 8899
HTC: 1499
HuaWei: 3499
Meizu: 2698
SAMSUNG: 7000
Vivo: 3200
Xiaomi: 1800
----------------
Apple: 8899
SAMSUNG: 7000
HuaWei: 3499
Vivo: 3200
Meizu: 2698
Xiaomi: 1800
HTC: 1499
+++++++++++++
Apple: 8899
SAMSUNG: 7000
HuaWei: 3499
Vivo: 3200
Meizu: 2698
Xiaomi: 1800
HTC: 1499
***************
HTC: 1499
Xiaomi: 1800
Meizu: 2698
Vivo: 3200
HuaWei: 3499
SAMSUNG: 7000
Apple: 8899
Map源码解析之HashMap红黑树 Map源码解析之HashMap 上一篇文章分析了HashMap的源码,但关于红黑树的部分都是粗略带过,这一篇文章则将着重分析HashMap中和红黑树相关的逻辑代码。 红黑树的理论知识可以参考红黑树(一)之 原理和算法详细介绍进行了解。 一. 红黑树的特性 (1) 每个节点或者是黑色,或者是红色。 (2) 根节点是黑色。 (3) 每个叶子节点(空节点,NIL节点)是黑色。 (4) 如果一个节点是红色... 阅读详情

相关推荐

让 AI 学会“慢思考”:MCP Sequential Thinking 深度部署与使用指南

摘要: MCP Sequential Thinking 是一种让AI具备"慢思考"能力的技术,通过动态调整思维路径解决复杂问题。本文详细介绍了在Windows、macOS和Linux系统下的部署方法,包括环境准备、配置文件修改等步骤。该技术通过"产生想法-评估需求-修正路径"的循环机制,显著提升AI在代码设计、数学证明等复杂任务中的表现。文章还提供了验证安装方法、使用示例和常见问题解答,帮助开发者解锁AI的深层思考能力。(149字)

weixin_43236925的博客 1907

HashMap的到底是有序还是无序

HashMap的到底是有序还是无序前提问题背景HashMap的一些特性问题分析结论再结论 前提 首先说明:HashMap不保证插入顺序,但是循环遍历时,输出顺序是不会改变的。 代码说明: public class HashMapTest { public static void main(String[] args) { HashMap<String, String> map = new HashMap<>(); map.put("aaa",

cchengone的博客 3万+

[Vue][面试]谈谈你对MVC、MVP和MVVM的理解

谈谈你对MVC、MVP和MVVM的理解 答题思路:此题涉及知识点很多,很难说清楚,说透彻,因为MVC,MVP这些我们前端程序员自己甚至都没用过。但是恰恰反映了前端这些年从无到有, 从有到优的变迁过程,因此沿此思路回答将十分清除。 Web1.0时代 在web1.0时代,并没有前端的概念。开发一个web应用多数采用ASP.NET/Java/PHP编写,项目通常由多个aspx/jsp/php文件构成,每个文件中同时包含了HTML、CSS、JavaScript、C#/Java/PHP代码, 系统整体架构可能如下图所

你好,欢迎光临! 723

HashMap的排序方法

因为Map中LinkedhashMap是有序的,所以将HashMap转化为LinkedHashMap可以实现排序 public Static Map<String,String> sortHashMap(Map<String,String> map){ Map<String,String> sortedMap = new LinkedHashMap&lt...

CC的博客 1万+

从模态到颤振:深入解读Nastran的V-g/V-f图,判断你的机翼设计是否安全

本文深入解析Nastran中的V-g/V-f图在机翼颤振分析中的应用,帮助工程师准确判断设计安全性。通过模态分析到颤振边界的完整判读逻辑,结合气动弹性特性,指导优化机翼结构设计,确保飞行安全。

weixin_28732953的博客 470

airodump-ng、aircrack-ng使用教程

wifi破解、airodump-ng、aircrack-ng脚本

ssmbyss的博客 2231

如何对HashMap进行排序

问题描述 这个问题从字面上看会有点奇怪,毕竟HashMap是按哈希值存储元素的,每个元素的位置是固定的,所以无法像list一样可以通过索引值list.get(i)去获取元素,由于位置由哈希值确定,也谈不上排序。 但是,问题就在于确实会遇到一些情形,比如我定义了一个map对象 Map<Student, Integer> map = new HashMap<>(); map是由学生类作为key,整型类作为value的,我的toString函数里面,希望它能够按照Integer(实际意义

weixin_45577864的博客 7997

tree_sitter多语言解析器配置实战指南

本文是一份详细的Tree-sitter多语言解析器配置实战指南。文章从零开始,手把手指导如何搭建Python环境、安装指定版本的tree-sitter库、下载并编译多种语言的语法规则,最终构建一个统一的解析器库。通过实战代码演示了如何初始化解析器、解析代码并遍历语法树,旨在帮助开发者高效处理多语言代码分析任务,并分享了高级技巧与常见问题排坑经验。

weixin_29245767的博客 267

HashMap遍历以及遍历顺序

HashMap遍历以及遍历顺序 HashMap是Java语言中一种键值对(key-value)数据结构,但不记录key的插入顺序,如果要按照插入顺序进行遍历,则需要使用LinkedHashMap类型。 本文将介绍下HashMap的三种遍历方式,LinkedHashMap遍历方式相同! (在leetcode12. 整数转罗马数字题目中使用到HashMap遍历,遂做此记录!) HashMap结构定义如下: Map<Integer, String> map = new HashMap<Inte

The coding paradise of Vincent Lee ^_^ 4492

【光伏风电功率预测】基于 ICEEMDAN + MSCNN-BiGRU-Attention 的并行预测模型

本文提出一种基于ICEEMDAN分解与多尺度深度学习的光伏/风电功率并行预测框架。针对多能源、多时间尺度、强非平稳特性带来的建模挑战,该模型首先通过改进的ICEEMDAN算法将原始功率序列分解为不同频段的IMF分量;随后为每个IMF构建包含多尺度CNN、双向GRU和注意力机制的子模型,实现局部特征提取与时序依赖建模;最后通过并行预测与重构获得最终功率输出。实验表明,该方法能有效解决模式混叠问题,提升预测精度,并支持光伏/风电的独立或联合预测部署,适用于风光联合调度等工程场景。

专注AI大模型,软件混淆,授权 154

基于LUT表对鱼眼图像进行畸变校正

当然也可以进行图像的畸变校正操作,已知相机的焦距为fx/fy,光心为cx/cy,像素大小为p(单位mm/pixel)对于畸变校正结果图中像素点(u,v),其对应的原图中的像素坐标(u',v')的计算流程描述如下。1)假设无畸变相机成像模型的焦距和光心与原相机相同,计算得到无畸变相机成像模型中归一化平面坐标(X,Y,Z),其中X=(u-cx)/fx,Y=(v-cy)/fy,Z=1。这里x'/y'的单位为像素。

On my way 639

Hashmap排序的几个方法

假设有这样的类: class Student { private Integer id; private String name; Student(Integer id, String name) { this.id = id; this.name = name; } public ...

jackyrongvip的专栏 2万+

Python全栈入门到实战【基础篇 22】生成器与迭代器:底层逻辑与实战场景

Python迭代器与生成器:惰性求值的高效实践 摘要:本文深入解析Python中迭代器和生成器的核心机制与应用场景。迭代器通过实现__iter__()和__next__()方法实现惰性求值,适合处理大数据集和无限序列。生成器作为迭代器的简化实现,通过yield关键字自动实现迭代器协议,代码更简洁。文章详细对比了可迭代对象与迭代器的区别,演示了自定义迭代器和生成器函数的实现方式,并介绍了生成器表达式这一高效替代列表推导式的方案。通过斐波那契数列等实例,展示了惰性求值在内存优化方面的优势,以及生成器在流式数据处

那些看似不起波澜的日复一日,会在某天让你看到坚持的意义 3260

深入理解LinkedHashMap 源码分析

一、LinkedHashMap结构 这是一个有序的,底层是继承于 HashMap 实现的,由一个双向链表所构成,具有和 HashMap 一样的快速查找特性。 LinkedHashMap 的排序方式有两种: 根据写入顺序排序。 根据访问顺序排序,每次 get 都会将访问的值移动到链表末尾,这样重复操作就能得到一个按照访问顺序排序的链表。 数据结构,通过以下代码调试可以看...

striveb的博客 299

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

SIMATIC S7-1200, S7-1500 PID 控制[手册]

SIMATIC S7-1200, S7-1500 PID 控制[手册]

LinkedHashMap 底层分析

LinkedHashMap 底层分析 众所周知 HashMap 是一个无序的 Map,因为每次根据 key 的 hashcode 映射到 Entry 数组上,所以遍历出来的顺序并不是写入的顺序。 因此 JDK 推出一个基于 HashMap 但具有顺序的 LinkedHashMap 来解决有排序需求的场景。 它的底层是继承于 HashMap 实现的,由一个双...

纯洁的明依 160

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

HashMap源码解析

崇祯五年十二月,余住西湖。大雪三日,湖中人鸟声俱绝。是日更定矣,余拏一小舟,拥毳衣炉火,独往湖心亭看雪。雾凇沆砀,天与云与山与水,上下一白。湖上影子,惟长堤一痕、湖心亭一点,与余舟一芥、舟中人两三粒而已。 到亭上,有两人铺毡对坐,一童子烧酒炉正沸。见余,大喜曰:“湖中焉得更有此人!”拉余同饮。余强饮三大白而别。问其姓氏,是金陵人,客此。及下船,舟子喃喃曰:“莫说相公痴,更有痴似相公者!” ——张岱《湖心亭看雪》 一、前言 本文分析HashMap源码和多线程下HashMap产生死锁的过程。后一篇文章.

moneywenxue的博客 9242

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

HashMap源码全面解析

HashMap 是基于哈希表的 `Map接口`的实现,是以 `key-value` 存储形式存在,即主要用来存储键值对。

专注Java后端技术干货、项目源码总结分享,期待您的关注。 1003

HashMap源码深度解析【重点】

【重点】HashMap源码深度解析 摘要哈希表哈希冲突HashMap 数据结构数据结构结语   同学们,今天我们一起来深度解析HashMap的源码,相信很多同学在面试过程中都会被问到源码,要数哪个被问得最多?大多同学肯定会想到HashMap,通过本文的学习,你将能轻松掌握HashMap的源码知识。 摘要   HashMap是Java程序员使用频率最高的用于映射(键值对)处理的数据类型。相对于JDK1.7,JDK1.8对HashMap底层的实现进行了优化,例如由原来的数组+链表转变成了数组+链表+红黑树的数据

ᶻᶻᶻ 枕星河的博客 2090

JDK源码解析之LinkedHashMap的两种排序

概述:        HashMap 是我们平常项目中经常使用到的集合之一,它存储的是键值对,采用的是 数组 + 链表 + 红黑树的数据结构(详细可看我之前写的一篇关于HashMap的源码的博客),存储的数据是无序的,但是如果我们项目中需要用到有序的HashMap,那么我们可以使用LinkedHashMap,使用归使用, 但是LinkedHashMap 为什么是有序的呢? 接下来就让我们进通

孤独的根号三_ 1361

深入解析HashMap源码

HashMap是Java程序员使用频率最高的用于映射(键值对)处理的数据类型。随着JDK(Java Developmet Kit)版本的更新,JDK1.8对HashMap底层的实现进行了优化,例如引入红黑树的数据结构和扩容的优化等。 ​ Java为数据结构中的映射定义了一个接口java.util.Map,此接口主要有四个常用的实现类,分别是HashMap、Hashtable、LinkedHash...

听得到微笑的博客 462

HashMap底层源码透彻解析

HashMap源码解析 HashMap简介 HashMap在底层数据结构上采用了数组+链表+红黑树,通过散列映射来存储键值对数据因为在查询上使用散列码(通过键生成一个数字作为数组下标,这个数字就是hashcode)所以在查询上的访问速度比较快,HashMap最多允许一对键值对的Key为Null,允许多对键值对的value为Null。它的线程不是安全的,在排序上面是无序的。 HashMap继承关系 HashMap主要成员变量 //Node可以看做就是一个节点,多个Node节点构成链表,当链表

Apandam的博客 324

红黑树应用之HashMap的TreeNode源码解析

入场 自从JDK1.8之后,HashMap就引入了红黑树,之前是数组+链表的结构,之后就是数组+链表+红黑树的结构, **事先声明一下对于HashMap刚了解的不适合看次篇文章**,可以去看看其他比较全的介绍HashMap文章,在此就不多说了, 此篇主要讲HashMap的TreeNode的左右旋的源码解析,主要自己对别人写得理解很迷糊,想自己记录下自己当时的理解,以后便于自己和大家更好的理解,话不...

开坦克的稻草人 812

Day24 - 集合 - HashMap底层源码超详细解析

HashMap 的源码看似复杂,其实逻辑是分层渐进的:数组 + 链表(链表冲突)+ 红黑树(优化性能),并结合扩容机制让它成为 Java 中最强大的“键值对”工具之一。

tang7mj的博客 1081

源码解析——HashMap

上面讲了一大堆理论,先来实践一下吧。HashMap为什么要用数组+链表/红黑树的结构?这个比较简单,数组+链表/红黑树(注意区别JDK1.7和1.8)HashMap为什么要用数组+链表/红黑树的结构?为了提高HashMap的查询效率和空间利用率数组是一种连续的存储结构,它可以通过索引快速定位元素,但是它的长度是固定的,如果数组过大,会浪费空间;如果数组过小,会导致哈希冲突。链表是一种离散的存储结构,它可以动态地增加或删除元素,但是它需要遍历才能找到元素,如果链表过长,会降低查询效率。

小熊的学习记录 607
上一篇: java中String字符串去掉双引号
下一篇: 深入List<map<string,object>> 集合排序的方法总结
Spring的思念
博客等级 码龄7年 80粉丝 143原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值