Map的种类

在Java中,Map的主要作用是存储键值对。由于是根据键得到值,所以不允许键重复。它主要有如下几个类别:

HashMap:

最常用的Map,它根据键的HashCode值存储数据,根据键可以直接获取它的值,具有很快的访问速度,遍历时,取得数据的顺序是完全随机的。HashMap最多只允许一条记录的键为Null;允许多条记录的值为Null;HashMap不支持线程的同步,即任一时刻可以有多个线程同时写HashMap;可能会导致数据的不一致。如果需要同步,可以用Collections的synchronizedMap方法使HashMap具有同步的能力,或者使用ConcurrentHashMap。Hashtable与HashMap类似,它继承自Dictionary类,不同的是:它不允许记录的键或者值为空;它支持线程的同步,即任一时刻只有一个线程能写Hashtable,因此也导致了 Hashtable在写入时会比较慢。

LinkedHashMap

保存了记录的插入顺序,在用Iterator遍历LinkedHashMap时,先得到的记录肯定是先插入的.也可以在构造时用带参数,按照应用次数排序。在遍历的时候会比HashMap慢,不过有种情况例外,当HashMap容量很大,实际数据较少时,遍历起来可能会比LinkedHashMap慢,因为LinkedHashMap的遍历速度只和实际数据有关,和容量无关,而HashMap的遍历速度和他的容量有关。

TreeMap

实现SortMap接口,能够把它保存的记录根据键排序,默认是按键值的升序排序,也可以指定排序的比较器,当用Iterator 遍历TreeMap时,得到的记录是排过序的。

按键排序

从上面Map的种类介绍我们可以看出,TreeMap是自带按键排序的功能的,只需要在创建的时候同时实现一个Compare的接口就可以了,例子如下:

private static void sort_by_key(){

Map treeMap = new TreeMap<>(new Comparator() {

@Override

public int compare(Integer o1, Integer o2) {

return o2-o1; //倒序.这里说明一下,如果返回负值,则o1先输出,反之则o2

}

});

//填充数据

for(int i = 0; i < 100;i++){

int key = (int)(10000*Math.random());

int value = (int)(10000*Math.random());

treeMap.put(key, value);

}

outMap(treeMap);

}

public static void outMap(Map map){

for(Integer integer:map.keySet()){

System.out.println("key="+integer+" value="+map.get(integer));

}

}

/* 结果如下:

key=9977 value=80

key=9684 value=7108

key=9422 value=1706

key=9264 value=1210

key=9248 value=4758

key=9024 value=7048

key=8892 value=3124

key=8879 value=6414

key=8814 value=8171

key=8728 value=1538

key=8513 value=4956

key=8462 value=5617

key=8355 value=8912

*/

从上面可以看出,按键排序是不难的,而安置排序就比较麻烦一些,需要将Map转一下。

按值排序

由于Java中Map并没有此功能,所以我们需要自己实现。思路如下:

Java中List是可以使用compare接口的。

Map实际上就是Entry<>的集合

那么使用List>就可以实现排序

将排好序的元素再插入到LinkedMap中

代码实现如下:

private static Map sortMap(Map linkedMap) {

List> cache = new ArrayList<>(linkedMap.entrySet());

//重写比较函数

Collections.sort(cache,new Comparator>() {

@Override

public int compare(Entry o1, Entry o2) {

//若返回值小于0,则o1在o2前面

return o2.getValue()-o1.getValue();

}

});

Map resultMap = new LinkedHashMap<>();

//将结果插入LinkedMap然后返回

for(int i = 0; i < cache.size();i++){

resultMap.put(cache.get(i).getKey(), cache.get(i).getValue());

}

return resultMap;

}

/*结果:

7965 9966

1067 9963

1720 9833

3257 9738

3934 9578

777 9348

1924 9315

3472 9270

3649 9114

5892 9078

*/

这样,按值排序和按键排序就都可以实现了。

java map 自动排序_Java中Map的排序相关推荐

  1. java map集合使用_JAVA中Map集合的使用举例

    首先创建一个Emp类,再将几个Emp对象添加到Map集合中. Emp的id作为Map的键,并将id为"005"的对象从集合中删除. package com.han; import ...

  2. java map传入参数_JAVA中map中参数的添加修改

    Map以按键/数值对的形式存储数据,和数组非常相似,在数组中存在的索引,它们本身也是对象. Map的接口 Map---实现Map Map.Entry--Map的内部类,描述Map中的按键/数值对. S ...

  3. java 排序_Java中常见的排序算法有哪些?---选择排序

    排序相关的的基本概念 排序: 将一组杂乱无章的数据按一定的规律顺次排列起来. 数据表( data list): 它是待排序数据对象的有限集合. 排序码(key):通常数据对象有多个属性域, 即多个数据 ...

  4. java中queue排序_Java中常见的排序算法有哪些?---选择排序

    排序相关的的基本概念 排序: 将一组杂乱无章的数据按一定的规律顺次排列起来. 数据表( data list): 它是待排序数据对象的有限集合. 排序码(key):通常数据对象有多个属性域, 即多个数据 ...

  5. java util 排序_Java中常见的排序方法

    本博主要介绍Java中几种常见的排序算法: /* 排序方法的演示 1)插入排序(直接插入排序.希尔排序) 2)交换排序(冒泡排序.快速排序) 3)选择排序(直接选择排序.堆排序) 4)归并排序 5)分 ...

  6. java合并排序_Java中的合并排序算法

    合并排序算法是一种分而治之的算法.在分而治之的范式中,一个问题被分解成较小的问题,其中每个小问题仍然保留着大问题的所有属性--大小除外.为了解决原始问题,每个部分都是单独解决的,然后这些部分又合并在一 ...

  7. java 中map的优点_java 中map遍历的四种方法和优缺点

    /** * 在for-each循环中使用entries来遍历 * 这是最常见的并且在大多数情况下也是最可取的遍历方式.在键值都需要时使用 * 如果遍历的是一个空的map,会报数组越界 ,java5引入 ...

  8. java map初始化方式_java中Map和List初始化的两种方法

    第一种方法(常用方法): //初始化List List list = new ArrayList(); list.add("string1"); list.add("st ...

  9. java list 排序_Java中List的排序

    场景 Bean定义如下,仅有一个类型为Integer的age字段. @NoArgsConstructor @AllArgsConstructor(staticName = "of" ...

最新文章

  1. html电池百分比,显示电池百分比在哪设置
  2. exchange无法收发邮件_Python使用POP3和SMTP协议收发邮件!
  3. Eclipse插件开发入门
  4. Enterprise Library Step By Step系列(一):配置应用程序块——入门篇
  5. twisted系列教程十八–异步操作的并行运行
  6. ADF12C+GLASSFISH4.1配置数据源
  7. 《Photoshop Lightroom4 经典教程》—第1课复习题答案
  8. 网传字节跳动实习生删除GB以下所有机器学习模型,差点没上头条......
  9. 正则全攻略使用手册,你确定不进来看看吗
  10. 虚拟化:侧信道攻击案例
  11. Emmagee工具的使用以及csv数据分析
  12. FPGA与ASIC及SOC的区别?ARM是什么
  13. 惜时间_惜时间的作文
  14. guzzle php,PHP网络请求插件Guzzle使用
  15. poj 1321 排兵布阵问题 dfs算法
  16. linux下hwclock及clock命令详解
  17. 玩转无线路由之DD-WRT基础扫盲
  18. 029. 露从今夜白,月是故乡明
  19. Resistors in Paralle题解
  20. thinkpad linux win7,Thinkpad t440 Win7+ubuntu双系统

热门文章

  1. quantization量化
  2. 85人教版高中英语第一册第十五课 NAPOLEON'S THREE QUESTIONS
  3. 编译器无法解析的外部符号问题
  4. ROC 曲线讲解 (Receiver Operarating Curve)
  5. Python判断字符串包含子字符串(个数、索引、全部位置)
  6. KISSY——事件Event.fire
  7. 摸鱼神器——python命令行小说阅读器实现
  8. 顺时将视频画面旋转90度的步骤
  9. mysql有cte吗_MySQL8 以上的 CTE
  10. python time.mktime