博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Java 对HashMap 进行排序的几种场景
阅读量:1907 次
发布时间:2019-04-26

本文共 3859 字,大约阅读时间需要 12 分钟。

Java中HashMap不同于Array、ArrayList和LinkedLists,它不会维持插入元素的顺序。因此对HashMap排序的掌握很重要。HashMap排序有两个步骤:

  • 1、通过map.entrySet()方法获取键值对;并将键值对传递给链表list;
  • 2、自定义比较器来使用Collections.sort()方法排序链表。

关于map的遍历方法可参考

例如下面的按照value降序排列:

Collections.sort(list, new Comparator
>() {
public int compare(Entry
ele1, Entry
ele2) {
return ele1.getValue().compareTo(ele2.getValue()); } });

灵活使用Comparator接口可以实现HashMap的灵活排序:包括分别对键、值的升降序排序,优先按值、其次按键排序,或者优先按键、其次按值排序;以上实现只需重写compare方法。

1、对value降序排列

public int compare(Map.Entry
e1,Map.Entry
e2){
return e2.getValue().compareTo(e1.getValue()); }

2、对键KEY降序排列

public int compare(Map.Entry
e1,Map.Entry
e2){
return e2.getKey().compareTo(e1.getKey()); }

3、优先按值value降序、其次按键key升序排序

public int compare(Map.Entry
e1,Map.Entry
e2){
int re = e2.getValue().compareTo(e1.getValue()); if(re!=0){
return re;} else{
return e1.getKey().compareTo(e2.getKey());} }

4、优先按键key降序、其次按值value升序排序

public int compare(Map.Entry
e1,Map.Entry
e2){
int re = e2.getKey().compareTo(e1.getKey()); if(re!=0){
return re;} else{
return e1.getValue().compareTo(e2.getValue());} }

例题:

题意描述:输入一个只包含小写英文字母和数字的字符串,按照不同字符统计个数由多到少输出统计结果,如果统计的个数相同,则按照ASCII码由小到大排序输出。
本题含有多组样例输入
很简单的一个思路就是先对map的值排序,然后再按照键排序。

import java.util.*;public class Main{
public static void main(String[] args) {
Scanner cin=new Scanner(System.in); while(cin.hasNext()){
Map
map = new HashMap
(); String string=cin.next(); for(int i=0;i
> list = new ArrayList<>(); list.addAll(map.entrySet()); Collections.sort(list,new Comparator
>(){
public int compare(Map.Entry
e1,Map.Entry
e2){ int re = e2.getValue().compareTo(e1.getValue()); if(re!=0){ return re;} else{ return e1.getKey().compareTo(e2.getKey());} } }); for(Map.Entry
map1:list){ System.out.print(map1.getKey()); } System.out.println(); } }}

当然,我们也可以利用普通类实现Comparable接口来对数据进行自定义排序

import java.util.*;public class Main {
public static void main(String[] args) {
Scanner cin=new Scanner(System.in); while(cin.hasNext()){
Map
map = new HashMap
(); String string=cin.next(); for(int i=0;i
list=new ArrayList<>(); for(Map.Entry
entry:map.entrySet()){
User user=new User(); user.setKey(entry.getKey()); user.setValue(entry.getValue()); list.add(user); user=null;//释放对象 } Collections.sort(list); for (User user:list){
System.out.print(user.getKey()); } System.out.println(); } } static class User implements Comparable
{
private Character key; private Integer value; public User() {
} @Override public int compareTo(User user) {
if(user.value==this.value) return this.key.compareTo(user.key); //value相同key升序 return user.value.compareTo(this.value); //value不同则value降序 } public Character getKey() {
return key; } public void setKey(Character key) {
this.key = key; } public Integer getValue() {
return value; } public void setValue(Integer value) {
this.value = value; } }}

转载地址:http://qyncf.baihongyu.com/

你可能感兴趣的文章
shell脚本之排序工具(sort、uniq)
查看>>
shell脚本之expect免交互
查看>>
shell编程之实战----MAC记录与端口扫描脚本、开发系统监控脚本
查看>>
ELK日志分析系统原理与部署
查看>>
Nginx访问状态以及基于多域名、多端口、多IP配置虚拟主机
查看>>
Nginx优化及防盗链
查看>>
Docker简介和安装优化
查看>>
Docker之镜像、容器的管理命令详解
查看>>
Docker-构建镜像、私有仓库registry、数据卷、端口映射、容器互联
查看>>
Tomcat安装部署、构建虚拟主机以及优化参数
查看>>
Nginx 之 Rewrite和具体场景
查看>>
利用Dockerfile构建服务镜像案例(ssh、systemd、nginx、tomcat)
查看>>
Dockerfile构建编译MYSQL-5.6、MYSQL-5.7镜像
查看>>
Docker Compose容器编排工具
查看>>
docker的资源控制(CPU、内存、IO)
查看>>
Docker Consul 工具(理论+实操)
查看>>
Docker容器通信安全----TLS加密通讯
查看>>
Docker-------私有仓库 Harbor 的搭建
查看>>
搭建KVM虚拟化平台(实战+理论)
查看>>
OpenStack入门及原理基础理论知识点
查看>>