一.理论准备

Map是键值对的集合接口,它的实现类主要包括:HashMap,TreeMap,Hashtable以及LinkedHashMap等。

TreeMap:基于红黑树(Red-Black tree)的 NavigableMap 实现,该映射根据其键的自然顺序进行排序,或者根据创建映射时提供的 Comparator 进行排序,具体取决于使用的构造方法。

HashMap的值是没有顺序的,它是按照key的HashCode来实现的,对于这个无序的HashMap我们要怎么来实现排序呢?参照TreeMap的value排序。

Map.Entry返回Collections视图。

二.key排序

TreeMap默认是升序的,如果我们需要改变排序方式,则需要使用比较器:Comparator。Comparator可以对集合对象或者数组进行排序的比较器接口,实现该接口的public compare(T o1,To2)方法即可实现排序,如下:

import java.util.Comparator;
import java.util.Iterator;
import java.util.Map;
import java.util.Set;
import java.util.TreeMap;public class TreeMapTest {public static void main(String[] args) {Map<String, String> map = new TreeMap<String, String>(new Comparator<String>() {public int compare(String obj1, String obj2) {// 降序排序return obj2.compareTo(obj1);}});map.put("b", "ccccc");map.put("d", "aaaaa");map.put("c", "bbbbb");map.put("a", "ddddd");Set<String> keySet = map.keySet();Iterator<String> iter = keySet.iterator();while (iter.hasNext()) {String key = iter.next();System.out.println(key + ":" + map.get(key));}}
}

运行结果如下:

d:aaaaa
c:bbbbb
b:ccccc
a:ddddd

三.value排序

上面例子是对根据TreeMap的key值来进行排序的,但是有时我们需要根据TreeMap的value来进行排序。对value排序我们就需要借助于Collections的sort(List<T> list, Comparator<? super T> c)方法,该方法根据指定比较器产生的顺序对指定列表进行排序。但是有一个前提条件,那就是所有的元素都必须能够根据所提供的比较器来进行比较,如下:

import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;
import java.util.TreeMap;public class TreeMapTest {public static void main(String[] args) {Map<String, String> map = new TreeMap<String, String>();map.put("a", "ddddd");map.put("c", "bbbbb");map.put("d", "aaaaa");map.put("b", "ccccc");//这里将map.entrySet()转换成listList<Map.Entry<String,String>> list = new ArrayList<Map.Entry<String,String>>(map.entrySet());//然后通过比较器来实现排序Collections.sort(list,new Comparator<Map.Entry<String,String>>() {//升序排序public int compare(Entry<String, String> o1,Entry<String, String> o2) {return o1.getValue().compareTo(o2.getValue());}});for(Map.Entry<String,String> mapping:list){ System.out.println(mapping.getKey()+":"+mapping.getValue()); } }
}

运行结果如下:

d:aaaaa
c:bbbbb
b:ccccc
a:ddddd

HashMap排序

HashMap本身是没有顺序的,不能直接对其进行排序

要排序只能先转成list然后对应list排序后,再转成LinkedHasHMap

这样做排序完全由自己定义,既可以多key排序也可以多value排序

private static void sortMapValue(){Map<String,String> map =new HashMap<>();map.put("a","2");map.put("c","5");map.put("d","6");map.put("b","1");List<Map.Entry<String,String>> lstEntry=new ArrayList<>(map.entrySet());Collections.sort(lstEntry,((o1, o2) -> {return o1.getValue().compareTo(o2.getValue());}));lstEntry.forEach(o->{System.out.println(o.getKey()+":"+o.getValue());});//如果一定要返回一个map,就new一个LinkedHashMap,将list中所有值依次put进去就可以/*LinkedHashMap<String,String> linkedHashMap=new LinkedHashMap<>();lstEntry.forEach(o->{linkedHashMap.put(o.getKey(),o.getValue());});*/}

结果为

b:1
a:2
c:5
d:6

Java Map 键值对排序 按key排序和按Value排序相关推荐

  1. java调用json转map_Java 把json对象转成map键值对的方法

    Java 把json对象转成map键值对的方法 发布于 2020-8-18| 复制链接 摘记: 工具方法: 本文的目的是把json串转成map键值对存储,而且只存储叶节点的数据maven 引用jar包 ...

  2. Java心得--键值、枚举器

    1. 集(Set):和数学上的"集合"概念相对应,是最简单的一种集合. Set集合中不区分元素的顺序,因此也就不记录元素的加入顺序. Set集合中不包含重复元素,即任意的两个元素e ...

  3. Java map按照值降序排列

    1)Java map按照值降序排列 思路是转成 list,然后再写入能保证顺序的 LinkedHashMap,普通的 HashMap和 TreeMap等不能保证顺序. /*** 降序排列 map*/p ...

  4. java的map键值类型是否固定_Java中Map根据键值(key)或者值(value)进行排序实现

    我们都知道,java中的Map结构是key->value键值对存储的,而且根据Map的特性,同一个Map中 不存在两个Key相同的元素,而value不存在这个限制.换句话说,在同一个Map中Ke ...

  5. java list键值_java基础之对List,Map,Set等集合键值对的简单认识

    [一.集合] 特征: 数组:定长.可以放基本数据类型. List:变长.只能放对象.有序,可重复. Set :变长.只能放对象.无序,不可重复. Map :变长.只能放对象.无序,键值对. 重要实现类 ...

  6. java 顺序存储键值对_java://Comparator、Comparable的用法(按照要求将map集合的键值对进行顺序输出)...

    import java.util.*; public class Person implements Comparable//使Person的属性具有比较性 { private String name ...

  7. mysql map 键值对获取_mysql map_get function,用于解析map结构数据,根据key返回相对应value...

    1.目的 mysql的列是固定的,不支持存储如Map 结构的数据,但现在我们的需求是希望有一个 ext Map的扩展列,可以存储Map结构的数据,并且可以在mysql里面进行运算.(即schema f ...

  8. mybatis返回map键值对_mybatis返回map key怎么指定

    展开全部 一.概述 MyBatis中在查询进行select映射的时候,返回类型可以用resultType,也可以用resultMap,resultType是直接表示返回类型的,而resultMap则是 ...

  9. java map清除值为null的元素_Java中的集合框架大总结

    直接上图: 从上面的集合框架图可以看到:Java集合框架主要包括两种类型的容器,一种是集合(Collection),存储一个元素集合:另一种是图(Map),存储键/值对映射.Collection接口又 ...

最新文章

  1. Node.js 执行webpack命令出现的错误
  2. linux usb 触摸屏驱动,请教大家一个linux下的usb触摸屏驱动的问题
  3. 【STM32】FreeRTOS创建和删除任务示例(动态方法)
  4. VMware下配置固定ip,于本机进行通信。
  5. Fizz Gateway API in Java
  6. firefox vimperator (图)
  7. 类的加载过程详解之过程一:Loading(加载)阶段
  8. UNP编程:15---UDP之(recvfrom、sendto函数)
  9. 实验室-Chrome小恐龙跑酷游戏加强版
  10. symbian 串行通信
  11. 5G工业路由器5G工业网关的区别
  12. 选择GoDaddy域名的好处有哪些?
  13. 计算机打不开 显示正在处理它,Win10系统打开此电脑显示正在处理它的解决方法...
  14. 区块链技术在物联网中的应用概述
  15. 杭州电子科技大学程序设计竞赛(2016’12)
  16. 东华大学计算机博士毕业要求,东华大学研究生在学期间发表学术论文要求的暂行规定(修订)...
  17. xp电脑对ajax的兼容性,xp系统iE11兼容性问题的详细技巧
  18. 北京交通大学计算机学院硕士导师,北京交通大学计算机与信息技术学院研究生导师:王涛...
  19. python创建长度为20的列表_如何在python中创建固定大小列表?
  20. REST/RESTFUL详解-转载

热门文章

  1. 达观数据:kubernetes简介和实战
  2. java 声效,在 Java 资料中播放声效
  3. java日程管理源代码_Java日程管理——万年行事历源代码
  4. 蓝海创意云丨稀缺又高端,为电影“补妆”的调色师是怎样炼成的!
  5. Delta3D Open Source Engine
  6. 安卓手机4G/5G网络数据流量(非WiFi)设置加密DNS
  7. n5100和n5105哪个好
  8. 中国电子学会2022年03月份青少年软件编程Scratch图形化等级考试试卷三级真题(含答案)
  9. Pandas实战教程 | 两列相减
  10. “漏洞之王”一年可以赚多少外快?