Java零基础手把手系列:HashMap排序方法一网打尽

HashMap的排序在一开始学习Java的时候,比较容易晕,今天总结了一些常见的方法,一网打尽。HashMap的排序入门,看这篇文章就够了。

1. 概述

本文排序HashMap的键(key)和值(value)使用的方法如下:

  • TreeMap
  • ArrayList 和 Collections.sort()
  • TreeSet
  • 使用 the Stream API

为了排序,我们先构造一个简单的HashMap,如下:

Map<String, Integer> unsortMap = new HashMap<>();
        unsortMap.put("key3", 5);
        unsortMap.put("key2", 4);
        unsortMap.put("key1", 3);
        unsortMap.put("key4", 2);
        unsortMap.put("key5", 1);

2. 使用TreeMap

第一种办法,利用TreeMap排序。Java里面实现TreeMap的默认逻辑是有序的:

插入到TreeMap的数据会按照Key排序。

所以这个是一个简单有效的办法,使用TreeMap排序HashMap。只需要一句话:

TreeMap<String, Integer> sorted = new TreeMap<>(map);
System.out.println(sorted);

输出是:

{key1=3, key2=4, key3=5, key4=2, key5=1}

3. 使用ArrayList

我们也可以使用ArrayList来辅助排序,和前文不一样的是:这里ArrayList只能按照Key或者Value排序

3.1 Sort by Key

使用ArrayList来辅助进行Key的排序:只需要从Map中获取到Key的集合,构造List即可,然后使用Collections的自带方法sort来排序,来看代码:

 List<String> sorted = new ArrayList<>(map.keySet());
 Collections.sort(sorted);

输出:

[key1, key2, key3, key4, key5]

然后我们可以遍历排好序的List,从map里面拿出相应的Values,这里就不写了,有兴趣的小伙伴可以亲自试试。

3.2 Sort by Value

同样地,我们可以使用HashMap的方法values(),取出所有的Value集合构造List,然后使用Collections.sort排序,代码如下:

List<String> sorted = new ArrayList<>(map.values());
Collections.sort(sorted);

输出:

[1, 2, 3, 4, 5]

4. 使用TreeSet

有时候HashMap里面存储的对象,可能有重复的,比如:有一个学生(年龄=28,名字=小红),排序的时候期望去掉这些重复的值,可以使用TreeSet。

Set是一种容器,里面存储的数据都是唯一的,不会重复

这里使用办法很简单,也是构造一个TreeSet,类似ArrayList传入Key的集合或者Values的集合即可:

SortedSet<Integer>  valueSorted = new TreeSet<>(map.values());
或者
SortedSet<String> keySorted = new TreeSet<>(map.keySet());

后续讲了类的基本概念,来实现一个可去重的排序。

5. 使用Lambdas和Streams

如果我们使用的是JDK 1.8以上,推荐使用Lambdas表达式和Stream API排序

我们要做的事情很简单:就是构造Steam流,传入要排序的Compare就可以了,而且Compare也不需要我们自己写,Java里面自带。 可以先不关注什么是Lambdas表达式,后面我们再来讲,现在只需要知道如何用来排序就好.

5.1 Sort by Key

首先使用entrySet.stream构造流pipeline,然后调用sorted函数传入内置的Compare,就大公告成了,如下:

map.entrySet()
   .stream()
   .sorted(Map.Entry.<String, Integer>comparingByKey())
   .forEach(System.out::println);

输出:

key1=3
key2=4
key3=5
key4=2
key5=1

5.2 Sort by Value

类似地,如果要按照Value排序,只需要传入内置Compare:comparingByValue即可

map.entrySet()
   .stream()
   .sorted(Map.Entry.comparingByValue())
   .forEach(System.out::println);

输出:

key5=1
key4=2
key1=3
key2=4
key3=5

!!!使用Steam和Lambdas表达的方法,强烈推荐!!!

6. 总结

终于大功告成了,手都给敲累了,不容易啊。
今天总结了几种常见的HashMap的排序办法,还有一个问题:如果是我们自己构造的类,如何排序呢?
这个就是要实现Comparable接口,然后重写里面的比较逻辑,等后面我们讲了类的基础,再细讲。

今天的代码,关注VX公号“写bug咯”,后台回复“hashmap”,即可获得。

可以添加博主vx交流:crazy042438

小伙伴们,要不也给一个赞吧。

posted @ 2019-09-14 22:31  LiangMeng  阅读(1021)  评论(0编辑  收藏  举报