Java 对HashMap进行排序的三种常见方法
作者:小z同学 发布时间:2022-11-04 19:02:10
标签:Java,HashMap,排序
首先来看看Map集合获取元素的三种常见方法keySet()、values()、entrySet()
1. values():
返回map集合的所有value的Collection集合(于集合中无序存放)
import java.util.*;
public class Main{
public static void main(String[] args){
Map<String, String> map = new HashMap<String, String>(); //构建键值对为<String, String>的Map集合
map.put("a", "aaa");
map.put("b", "bbb");
map.put("c", "ccc");
Collection<String> collection = map.values(); //获取map集合的所有value的Collection集合(于集合中无序存放)
System.out.println(collection);
}
}
/**
* 运行结果
* [bbb, ccc, aaa]
*/
2. keySet():
返回map集合的所有键的Set集合(于Set集合中无序存放)
通过迭代取出所有key,再利用get()方法获取value, for(类型 元素: 集合) 的本质是获取集合的迭代器进行迭代
import java.util.*;
public class Main{
public static void main(String[] args){
Map<String, String> map = new HashMap<String, String>(); //构建键值对为<String, String>的Map集合
map.put("a", "aaa");
map.put("b", "bbb");
map.put("c", "ccc");
Set<String> keySet = map.keySet(); //获取map集合的所有键的Set集合(于Set集合中无序存放)
Iterator<String> iter = keySet.iterator(); //获取keySet集合的迭代器
while(iter.hasNext()){
String key = iter.next();
String value = map.get(key);
System.out.println("key:" + key + "-->value:" + value);
}
/*
for(String key: keySet){
String value = map.get(key);
System.out.println("key:" + key + "-->value:" + value);
}
*/
}
}
/**
* 运行结果
* key:b-->value:bbb
* key:c-->value:ccc
* key:a-->value:aaa
*/
3. entrySet():
返回map集合的所有"映射"的Set集合,这里规范每个"映射"的类型为Map.Entry<K, V>(于Set集合中无序存放)
通过迭代取出所有的“映射”,再利用getKey()、getValue()方法获取相应键、值
import java.util.*;
public class Main{
public static void main(String[] args){
Map<String, String> map = new HashMap<String, String>(); //构建键值对为<String, String>的Map集合
map.put("a", "aaa");
map.put("b", "bbb");
map.put("c", "ccc");
Set<Map.Entry<String, String>> entrySet = map.entrySet(); //获取map集合的所有"映射"的Set集合,这里规范每个映射的类型为Map.Entry<K, V>(于Set集合中无序存放)
Iterator<Map.Entry<String, String>> iter = entrySet.iterator(); //获取entrySet集合的迭代器,Map.Entry<K, V>为迭代元素的类型
while(iter.hasNext()){
Map.Entry<String, String> item = iter.next();
String key = item.getKey();
String value = item.getValue();
System.out.println("key:" + key + "-->value:" + value);
}
/*
for(Map.Entry<String, String> item: entrySet){
String key = item.getKey();
String value = item.getValue();
System.out.println("key:" + key + "-->value:" + value);
}
*/
}
}
/**
* 运行结果
* key:b-->value:bbb
* key:c-->value:ccc
* key:a-->value:aaa
*/
有以上方法作为基础,那么我们很容易想到对HashMap进行排序的两种方法
1. 通过keySet()获取Map集合的所有键的Set集合,由List集合获取其中所有元素,通过比较器对元素为键的List集合进行排序
2. 通过entrySet()获取Map集合所有映射的Set集合,由List集合获取其中所有元素,通过比较器对元素为"映射"List集合进行排序
通过对比较器compare方法的Override,两者还可以实现利用value进行排序。有关java中Comparable和Comparator比较的详解
import java.util.*;
public class DescKeyComparator implements Comparator<String>{
public static void main(String[] args){
Map<String, String> map = new HashMap<String, String>(); //构建键值对为<String, String>的Map集合
map.put("a", "aaa");
map.put("b", "bbb");
map.put("c", "ccc");
Set<String> entrySet = map.keySet(); //获取map集合的所有键的Set集合(于Set集合中无序存放)
List<String> list = new ArrayList<String>(entrySet); //新建List集合获取Set集合的所有元素(键对象)(顺序与Set集合一样)
/**
* 接下来的排序是list的专长了
* 通过“比较器(DescKeyComparator)”,对list进行排序
*/
Collections.sort(list, new DescKeyComparator());
/*
Collections.sort(list); //String实现了Comparable,默认升序排列
*/
Iterator<String> iter = list.iterator(); //获取List集合的迭代器,String为迭代元素的类型
while(iter.hasNext()){
String key = iter.next();
String value = map.get(key);
System.out.println("key:" + key + "-->value:" + value);
}
/*
for(Map.Entry<String, String> item: list){
String key = iter.next();
String value = map.get(key);
System.out.println("key:" + key + "-->value:" + value);
}
*/
}
@Override
public int compare(String key1, String key2){
return key2.compareTo(key1); //降序排序; String作为api提供的类,实现了Comparable的compareTo方法被设计成小于、等于、大于分别返回负数、零、正数
}
}
/**
* 运行结果
* key:c-->value:ccc
* key:b-->value:bbb
* key:a-->value:aaa
*/
import java.util.*;
public class AscKeyComparator implements Comparator<Map.Entry<String, String>>{
public static void main(String[] args){
Map<String, String> map = new HashMap<String, String>(); //构建键值对为<String, String>的Map集合
map.put("a", "aaa");
map.put("b", "bbb");
map.put("c", "ccc");
Set<Map.Entry<String, String>> entrySet = map.entrySet(); //获取map集合的所有"映射"的Set集合,这里规范每个映射的类型为Map.Entry<K, V>(于Set集合中无序存放)
List<Map.Entry<String, String>> list = new ArrayList<Map.Entry<String, String>>(entrySet); //新建List集合获取Set集合的所有元素("映射"对象)(顺序与Set集合一样)
/**
* 接下来的排序是list的专长了
* 通过“比较器(AscKeyComparator)”,对list进行排序
*/
Collections.sort(list, new AscKeyComparator());
Iterator<Map.Entry<String, String>> iter = list.iterator(); //获取List集合的迭代器,Map.Entry<K, V>为迭代元素的类型
while(iter.hasNext()){
Map.Entry<String, String> item = iter.next();
String key = item.getKey();
String value = item.getValue();
System.out.println("key:" + key + "-->value:" + value);
}
/*
for(Map.Entry<String, String> item: list){
String key = item.getKey();
String value = item.getValue();
System.out.println("key:" + key + "-->value:" + value);
}
*/
}
@Override
public int compare(Map.Entry<String, String> item1, Map.Entry<String, String> item2){
return item1.getKey().compareTo(item2.getKey()); //升序排序
}
}
/**
* 运行结果
* key:a-->value:aaa
* key:b-->value:bbb
* key:c-->value:ccc
*/
来源:https://www.cnblogs.com/zzzz76/p/6891698.html
0
投稿
猜你喜欢
- 一、前言:前段时间微信更新了新版本后,带来的一款H5小游戏“跳一跳”在各朋友圈里又火了起来,类似以前的“ * ”游戏,这游戏玩法简单,但加上
- 在Springboot+Mybatis-plus不使用SQL语句进行多表添加操作我所遇到的问题准备工作在测试环境下模拟思维分解一下:创建出一
- 我们在学习接口的时候。能够在里面做一些方法的调用。不过今天所要讲的JDBC,虽然也是连接数据库的一种接口,不过与类接口有着很大的区别,大家要
- 前言CMake是一个跨平台的安装编译工具,可以用简单的语句来描述所有平台的安装(编译过程)。CMake可以说已经成为大部分C++开源项目标配
- 问题使用前后端分离模式开发项目时,往往会遇到这样一个问题 -- 无法跨域获取服务端数据这是由于浏览器的同源策略导致的,目的是为了安全。在前后
- 前言因为最近的项目需要使用录音功能,开始的想法是Button+OnTouchListener+Dialog实现,在大部分手机中都没问题,只有
- 前言${} 和 #{} 都是 MyBatis 中用来替换参数的,它们都可以将用户传递过来的参数,替换到 MyBatis 最终生成的
- 1 双向链表1.1 双向链表介绍相较单链表,双向链表除了data与next域,还多了一个pre域用于表示每个节点的前一个元素。这样做给双向链
- 前言在开发中常要处理横竖屏切换,怎么处理先看生命周期申明Activity 横竖屏切换时需要回调两个函数 ,所以在此将这个两个函数暂时看成是A
- 最近碰到一个大转盘的业务,奖品可根据数据后台灵活设置中奖概率,看起来挺简单的业务功能,但实现起来对我这个毫无经验的人来说并不容易,后面又碰到
- 安卓使用SmsManager实现发送短信,供大家参考,具体内容如下关键代码实现package com.example.sms; import
- SpringBoot集成Mybatis时mybatis.mapper-locations和@MapperScan的作用1、mybatis.m
- 本文实例讲述了Spring实战之ResourceLoader接口资源加载用法。分享给大家供大家参考,具体如下:一 代码package lee
- Sentinel是阿里巴巴开源的限流器熔断器,并且带有可视化操作界面。在日常开发中,限流功能时常被使用,用于对某些接口进行限流熔断,譬如限制
- C# 的类型系统可分为两种类型,一是值类型,一是引用类型,这个每个C#程序员都了解。还有托管堆,栈,ref,out等等概念也是每个C#程序员
- 一、JPype简述1.JPype是什么?JPype是一个能够让 python 代码方便地调用 Java 代码的工具,从而克服了 python
- 为什么需要组件化小项目是不需要组件化的。当一个项目有数十个人开发,编译项目要花费10分钟,修改一个bug就可能会影响到其他业务,小小的改动就
- Android开发环境有三种方式,分别是JDK+SDK+Eclipse+ADT、JDK+adt-bundle与JDK+Android Stu
- 本文实例讲述了Android编程之防止反编译的实现方法。分享给大家供大家参考,具体如下:1. 判断程序是否运行在模拟器上boolean is
- 起因最近在写CRUD的时候,发现有个分页的VO写的健壮性比较差,一时手痒改了一下,没想到改了之后好几个功能都出现了问题。原VO关键代码如下: