Map的有序和无序实现类,与Map的排序

1.HashMap、Hashtable不是有序的;
2.TreeMap和LinkedHashMap是有序的(TreeMap默认 Key 升序,LinkedHashMap则记录了插入顺序)。

今天做统计时需要对X轴的地区按照地区代码(areaCode)进行排序,由于在构建XMLData使用的map来进行数据统计的,所以在统计过程中就需要对map进行排序。

一、简单介绍Map

在讲解Map排序之前,我们先来稍微了解下map。map是键值对的集合接口,它的实现类主要包括:HashMap,TreeMap,Hashtable以及LinkedHashMap等。其中这四者的区别如下(简单介绍):

  • HashMap:我们最常用的Map,它根据key的HashCode 值来存储数据,根据key可以直接获取它的Value,同时它具有很快的访问速度。HashMap最多只允许一条记录的key值为Null(多条会覆盖);允许多条记录的Value为 Null。非同步的。

  • TreeMap: 能够把它保存的记录根据key排序,默认是按升序排序,也可以指定排序的比较器,当用Iterator 遍历TreeMap时,得到的记录是排过序的。TreeMap不允许key的值为null。非同步的。

  • Hashtable: 与 HashMap类似,不同的是:key和value的值均不允许为null;它支持线程的同步,即任一时刻只有一个线程能写Hashtable,因此也导致了Hashtale在写入时会比较慢。

  • LinkedHashMap: 保存了记录的插入顺序,在用Iterator遍历LinkedHashMap时,先得到的记录肯定是先插入的.在遍历的时候会比HashMap慢。key和value均允许为空,非同步的。

二、Map排序

TreeMap
TreeMap默认是升序的,如果我们需要改变排序方式,则需要使用比较器:Comparator。

Comparator可以对集合对象或者数组进行排序的比较器接口,实现该接口的public compare(T o1,To2)方法即可实现排序,该方法主要是根据第一个参数o1,小于、等于或者大于o2分别返回负整数、0或者正整数。如下:

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("c", "ccccc");map.put("a", "aaaaa");map.put("b", "bbbbb");map.put("d", "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:ddddd c:ccccc b:bbbbb a:aaaaa

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

public class TreeMapTest {public static void main(String[] args) {Map<String, String> map = new TreeMap<String, String>();map.put("d", "ddddd");map.put("b", "bbbbb");map.put("a", "aaaaa");map.put("c", "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()); } }
}
      a:aaaaa b:bbbbb c:ccccc d:ddddd

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

public class HashMapTest {public static void main(String[] args) {Map<String, String> map = new HashMap<String, String>();map.put("c", "ccccc");map.put("a", "aaaaa");map.put("b", "bbbbb");map.put("d", "ddddd");List<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()); } }}

运行结果

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

Map的有序和无序实现类,与Map的排序相关推荐

  1. c++ map是有序还是无序的_c++中map与unordered_map的区别

    map: 优点: 有序性,这是map结构最大的优点,其元素的有序性在很多应用中都会简化很多的操作 红黑树,内部实现一个红黑书使得map的很多操作在lgn的时间复杂度下就可以实现,因此效率非常的高 缺点 ...

  2. java hashmap 无序_Map的有序和无序实现类,与Map的排序

    1.HashMap.Hashtable不是有序的: 2.TreeMap和LinkedHashMap是有序的(TreeMap默认 Key 升序,LinkedHashMap则记录了插入顺序). 今天做统计 ...

  3. c++ map是有序还是无序的_go 学习笔记之数组还是切片都没什么不一样

    上篇文章中详细介绍了 Go 的基础语言,指出了 Go 和其他主流的编程语言的差异性,比较侧重于语法细节,相信只要稍加记忆就能轻松从已有的编程语言切换到 Go 语言的编程习惯中,尽管这种切换可能并不是特 ...

  4. c++ map是有序还是无序的_c++ unorder_map的用法

    1.unorder_map与map不同:map的KEY值是有序的,而unorder_map则是无序的: 2.unorder_map自定义的KEY值时需要注意思下面两点: · KEY为一个类时,需要重载 ...

  5. c++ map是有序还是无序的_C++ STL中Map的按Key排序和按Value排序

    map是用来存放键值对的数据结构,可以很方便快速的根据key查到相应的value.假如存储学生和其成绩(假定不存在重名,当然可以对重名加以区分),我们用map来进行存储就是个不错的选择. 我们这样定义 ...

  6. Java实体类转Map、Map转实体类

    创建utils(EntityUtils.java) package com.jeff.utils;import java.lang.reflect.Field; import java.util.Ha ...

  7. java list有序还是无序_java的集合框架

    前言 使用java编程语言的开发人员,在日常开发过程中经常会使用到java的一些集合类,不过这些集合类太多,很多人对它们的特点和使用场景不是特别的了解,通过此文给大家总结一下这方面的知识,方便大家面试 ...

  8. 小汤学编程之JAVA基础day11——集合框架:List/Set/Map集合、Collections集合工具类、泛型、TreeMap和TreeSet

    一.集合的特点 二.继承结构图 三.List集合 1.特点     2.ArrayList类     3.LinkedList类     4.两者的对比     5.集合的遍历 四.Set集合 1.特 ...

  9. python列表元组字符串都属于有序数列_列表、元组、字符串是Python的__________(有序、无序?)序列。...

    [简答题]朗读d教科书第35页"貿易レターコラム 消費価格値上げ再考のお願い"的李文,直接读标题,然后读"拝啓"和全文.注意作业提交截止日期. [多选题]以下语 ...

最新文章

  1. 建立实体-关系模型4
  2. 苹果接盘倒下的无人车公司:吴恩达旗下,曾估值2亿美元,CEO及大部分员工被裁...
  3. 验证网站地址是否有效
  4. 【Linux】一步一步学Linux——grep命令(49)
  5. httpclient 调用WebAPI
  6. ubuntu 安装deb程序文件失败的解决方法
  7. Mybatis 框架源码解读(详细流程图+时序图)
  8. Linux内核的Nand驱动流程分析
  9. 图解 Android Handler 线程消息机制
  10. PHP疗法,人体穴位疗法的秘密-咔咔养生网
  11. linux远程链接Windows桌面,linux远程桌面链接windows
  12. 一套适合入门的Oracle学习视频
  13. 打砖块 如何实现三个球 java_小球弹砖块游戏(JAVA)
  14. PM2.5空气质量提醒实验
  15. android自定义抽屉布局,自定义Drawer,抽屉布局
  16. 基于电力行业信息安全基线的量化管理系统研究与应用
  17. Java打造RPC框架(四):支持zookeeper与负载均衡
  18. 大数据量查询大杀器之Mybatis 流式查询
  19. matlab极坐标系给定圆心画圆,matlab画极坐标
  20. 带宽与码元的关系_数据速率、载波频率和带宽的关系

热门文章

  1. Linux玩游戏卡顿,电脑玩游戏卡顿的原因主要是什么 电脑为什么玩游戏会卡
  2. 美伦美唤|颇具辨识度的桌搭好物,漫步者蓝牙音响上手评测
  3. 微信Token验证失败原因及解决方案
  4. Qt Quick 3D系列(一):加载3d模型
  5. Android蓝牙配对时不弹框
  6. 06 初等矩阵和矩阵的可逆性
  7. 幼儿园计算机教学计划,幼儿园计算机可以识别可爱的鼠标活动教学计划
  8. 为什么在很多主流引擎都开源的情况下,网易游戏还在做底层技术创新?
  9. 浅谈Mysql共享锁、排他锁、悲观锁、乐观锁及其使用场景
  10. windows7文件夹权限添加,解决目标文件夹访问被拒绝