Java 对HashMap进行排序的三种常见方法
作者:小z同学 时间:2022-11-04 19:02:10
首先来看看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
标签:Java,HashMap,排序
![](/images/zang.png)
![](/images/jiucuo.png)
猜你喜欢
Java中的匿名对象定义与用法实例分析
2023-04-11 20:03:05
Android 8.0系统中通知栏的适配详解
2022-03-03 07:38:20
![](https://img.aspxhome.com/file/2023/4/139314_0s.png)
spring boot如何实现切割分片上传
2023-06-29 02:49:26
![](https://img.aspxhome.com/file/2023/7/57487_0s.png)
详解spring mvc中url-pattern的写法
2023-11-11 07:30:58
java反射获取和调用方法
2021-11-23 11:05:02
超简单C#获取带汉字的字符串真实长度(单个英文长度为1,单个中文长度为2)
2021-11-13 20:37:55
![](https://img.aspxhome.com/file/2023/0/104290_0s.png)
android自定义View实现圆环颜色选择器
2023-11-07 19:16:02
![](https://img.aspxhome.com/file/2023/8/125348_0s.gif)
SpringBoot统一响应格式及统一异常处理
2022-08-30 08:03:08
![](https://img.aspxhome.com/file/2023/5/63155_0s.png)
C#事务处理(Execute Transaction)实例解析
2022-04-12 15:32:43
Android编程基础之简单Button事件响应综合提示控件Toast应用示例
2023-06-30 16:27:34
![](https://img.aspxhome.com/file/2023/6/137426_0s.jpg)
android 更改TextView中任意位置字体大小和颜色的方法
2021-10-21 01:51:43
![](https://img.aspxhome.com/file/2023/0/138730_0s.jpg)
Java深入浅出掌握SpringBoot之MVC自动配置原理篇
2022-04-16 02:14:34
![](https://img.aspxhome.com/file/2023/8/94328_0s.png)
如何解决@NotBlank不生效的问题
2022-04-01 13:41:08
![](https://img.aspxhome.com/file/2023/0/82980_0s.png)
基于Android Service 生命周期的详细介绍
2021-09-11 08:11:42
![](https://img.aspxhome.com/file/2023/3/137833_0s.png)
Android11文件管理权限申请详细介绍
2023-08-28 17:41:47
![](https://img.aspxhome.com/file/2023/6/137656_0s.png)
C# 解析 Excel 并且生成 Csv 文件代码分析
2021-11-09 18:04:04
java 实现定时的方法及实例代码
2023-03-31 22:48:41
idea maven pom不自动更新的解决方法
2021-11-19 14:56:46
![](https://img.aspxhome.com/file/2023/9/62209_0s.jpg)
Unity3D Ui利用shader添加效果
2022-09-17 15:32:47
![](https://img.aspxhome.com/file/2023/7/89817_0s.gif)
Spring超详细讲解IOC与解耦合
2023-06-16 12:32:50
![](https://img.aspxhome.com/file/2023/3/66713_0s.png)