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,排序
0
投稿

猜你喜欢

  • Java中的匿名对象定义与用法实例分析

    2023-04-11 20:03:05
  • Android 8.0系统中通知栏的适配详解

    2022-03-03 07:38:20
  • spring boot如何实现切割分片上传

    2023-06-29 02:49:26
  • 详解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
  • android自定义View实现圆环颜色选择器

    2023-11-07 19:16:02
  • SpringBoot统一响应格式及统一异常处理

    2022-08-30 08:03:08
  • C#事务处理(Execute Transaction)实例解析

    2022-04-12 15:32:43
  • Android编程基础之简单Button事件响应综合提示控件Toast应用示例

    2023-06-30 16:27:34
  • android 更改TextView中任意位置字体大小和颜色的方法

    2021-10-21 01:51:43
  • Java深入浅出掌握SpringBoot之MVC自动配置原理篇

    2022-04-16 02:14:34
  • 如何解决@NotBlank不生效的问题

    2022-04-01 13:41:08
  • 基于Android Service 生命周期的详细介绍

    2021-09-11 08:11:42
  • Android11文件管理权限申请详细介绍

    2023-08-28 17:41:47
  • 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
  • Unity3D Ui利用shader添加效果

    2022-09-17 15:32:47
  • Spring超详细讲解IOC与解耦合

    2023-06-16 12:32:50
  • asp之家 软件编程 m.aspxhome.com