Java——HashMap键值排序

简介: Java——HashMap键值排序

Map集合排序——根据value对key进行排序


首先来看看Map集合获取元素的三种常见方法keySet()、values()、entrySet()


values():返回map集合的所有value的Collection集合(于集合中无序存放)

1 import java.util.*;
 2 
 3 public class Main{
 4     public static void main(String[] args){
 5         Map<String, String> map = new HashMap<String, String>();    //构建键值对为<String, String>的Map集合
 6         map.put("a", "aaa");
 7         map.put("b", "bbb");
 8         map.put("c", "ccc");
 9     
10         Collection<String> collection = map.values();    //获取map集合的所有value的Collection集合(于集合中无序存放)
11         System.out.println(collection);
12     }
13 }
14 
15 /**
16  * 运行结果
17  * [bbb, ccc, aaa]
18  */


keySet():返回map集合的所有键的Set集合(于Set集合中无序存放)


通过迭代取出所有key,再利用get()方法获取value, for(类型 元素: 集合) 的本质是获取集合的迭代器进行迭代

1 import java.util.*;
 2  
 3 public class Main{
 4     public static void main(String[] args){
 5         Map<String, String> map = new HashMap<String, String>();    //构建键值对为<String, String>的Map集合
 6         map.put("a", "aaa");
 7         map.put("b", "bbb");
 8         map.put("c", "ccc");
 9         
10         Set<String> keySet = map.keySet();    //获取map集合的所有键的Set集合(于Set集合中无序存放)
11         Iterator<String> iter = keySet.iterator();    //获取keySet集合的迭代器
12         while(iter.hasNext()){
13             String key = iter.next();
14             String value = map.get(key);
15             System.out.println("key:" + key + "-->value:" + value);
16         }
17         /*
18         for(String key: keySet){
19             String value = map.get(key);
20             System.out.println("key:" + key + "-->value:" + value);
21         }
22         */
23     }
24 }
25 
26 /**
27  * 运行结果
28  * key:b-->value:bbb
29  * key:c-->value:ccc
30  * key:a-->value:aaa
31  */


entrySet():返回map集合的所有"映射"的Set集合,这里规范每个"映射"的类型为Map.Entry(于Set集合中无序存放)通过迭代取出所有的“映射”,再利用getKey()、getValue()方法获取相应键、值

1 import java.util.*;
 2 
 3 public class Main{
 4     public static void main(String[] args){
 5         Map<String, String> map = new HashMap<String, String>();    //构建键值对为<String, String>的Map集合
 6         map.put("a", "aaa");
 7         map.put("b", "bbb");
 8         map.put("c", "ccc");
 9     
10         Set<Map.Entry<String, String>> entrySet = map.entrySet();    //获取map集合的所有"映射"的Set集合,这里规范每个映射的类型为Map.Entry<K, V>(于Set集合中无序存放)
11         Iterator<Map.Entry<String, String>> iter = entrySet.iterator();    //获取entrySet集合的迭代器,Map.Entry<K, V>为迭代元素的类型
12         while(iter.hasNext()){
13             Map.Entry<String, String> item = iter.next();
14             String key = item.getKey();
15             String value = item.getValue();
16             System.out.println("key:" + key + "-->value:" + value);
17         }
18         /*
19         for(Map.Entry<String, String> item: entrySet){
20             String key = item.getKey();
21             String value = item.getValue();
22             System.out.println("key:" + key + "-->value:" + value);
23         }
24         */
25     }
26 }
27 
28 /**
29  * 运行结果
30  * key:b-->value:bbb
31  * key:c-->value:ccc
32  * key:a-->value:aaa
33  */


有以上方法作为基础,那么我们很容易想到对HashMap进行排序的两种方法


1.通过keySet()获取Map集合的所有键的Set集合,由List集合获取其中所有元素,通过比较器对元素为键的List集合进行排序


2.通过entrySet()获取Map集合所有映射的Set集合,由List集合获取其中所有元素,通过比较器对元素为"映射"List集合进行排序


通过对比较器compare方法的Override,两者还可以实现利用value进行排序。


1 import java.util.*;
 2 
 3 public class DescKeyComparator implements Comparator<String>{
 4     public static void main(String[] args){
 5         Map<String, String> map = new HashMap<String, String>();    //构建键值对为<String, String>的Map集合
 6         map.put("a", "aaa");
 7         map.put("b", "bbb");
 8         map.put("c", "ccc");
 9     
10         Set<String> entrySet = map.keySet();    //获取map集合的所有键的Set集合(于Set集合中无序存放)
11         List<String> list = new ArrayList<String>(entrySet);    //新建List集合获取Set集合的所有元素(键对象)(顺序与Set集合一样)
12         /** 
13          * 接下来的排序是list的专长了
14          * 通过“比较器(DescKeyComparator)”,对list进行排序
15          */
16         Collections.sort(list, new DescKeyComparator());
17         /*
18         Collections.sort(list);    //String实现了Comparable,默认升序排列
19         */
20         Iterator<String> iter = list.iterator();    //获取List集合的迭代器,String为迭代元素的类型
21         while(iter.hasNext()){
22             String key = iter.next();
23             String value = map.get(key);
24             System.out.println("key:" + key + "-->value:" + value);
25         }
26         /*
27         for(Map.Entry<String, String> item: list){
28             String key = iter.next();
29             String value = map.get(key);
30             System.out.println("key:" + key + "-->value:" + value);
31         }
32         */
33     }
34     
35     @Override
36     public int compare(String key1, String key2){
37         return key2.compareTo(key1);    //降序排序; String作为api提供的类,实现了Comparable的compareTo方法被设计成小于、等于、大于分别返回负数、零、正数
38     }
39 }
40 
41 /**
42  * 运行结果
43  * key:c-->value:ccc
44  * key:b-->value:bbb
45  * key:a-->value:aaa
46  */
1 import java.util.*;
 2 
 3 public class AscKeyComparator implements Comparator<Map.Entry<String, String>>{
 4     public static void main(String[] args){
 5         Map<String, String> map = new HashMap<String, String>();    //构建键值对为<String, String>的Map集合
 6         map.put("a", "aaa");
 7         map.put("b", "bbb");
 8         map.put("c", "ccc");
 9     
10         Set<Map.Entry<String, String>> entrySet = map.entrySet();    //获取map集合的所有"映射"的Set集合,这里规范每个映射的类型为Map.Entry<K, V>(于Set集合中无序存放)
11         List<Map.Entry<String, String>> list = new ArrayList<Map.Entry<String, String>>(entrySet);    //新建List集合获取Set集合的所有元素("映射"对象)(顺序与Set集合一样)
12         /** 
13          * 接下来的排序是list的专长了
14          * 通过“比较器(AscKeyComparator)”,对list进行排序
15          */
16         Collections.sort(list, new AscKeyComparator());
17         
18         Iterator<Map.Entry<String, String>> iter = list.iterator();    //获取List集合的迭代器,Map.Entry<K, V>为迭代元素的类型
19         while(iter.hasNext()){
20             Map.Entry<String, String> item = iter.next();
21             String key = item.getKey();
22             String value = item.getValue();
23             System.out.println("key:" + key + "-->value:" + value);
24         }
25         /*
26         for(Map.Entry<String, String> item: list){
27             String key = item.getKey();
28             String value = item.getValue();
29             System.out.println("key:" + key + "-->value:" + value);
30         }
31         */
32     }
33     
34     @Override
35     public int compare(Map.Entry<String, String> item1, Map.Entry<String, String> item2){
36         return item1.getKey().compareTo(item2.getKey());    //升序排序
37     }
38 }
39 
40 /**
41  * 运行结果
42  * key:a-->value:aaa
43  * key:b-->value:bbb
44  * key:c-->value:ccc
45  */


以下是我的练习小Demo,HashMap键值排序


需要注意的是:


Comparator和Comparable的区别


Comparable:自己(this)和别人(参数)比较,自己需要实现Comparable接口,重写比较的规则compareTo方法


Comparator:相当于找一个第三方的裁判,比较两个


Comparator的排序规则:o1-o2:升序


package cn.kgc.kb03.homework10;
/**
 * @author:?
 * @date:2019/9/5
 * @aim: 统计同学的学号,姓名,并插入map中
 *要求:遍历所有同学,原本乱序,按学号排序
 */
public class Student implements Comparable {
    private int num;
    private String name;
    public Student(){
    }
    public Student(int num, String name){
        this.num=num;
        this.name=name;
    }
    public int getNum() {
        return num;
    }
    public void setNum(int num) {
        this.num = num;
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    //.toString 方法是将对象及其他转换成字符串的形式表达
    //这个方法重新定义toString ,是返回值是自身期望的。
    public String toString(){
        return "学号:"+num+" 姓名:"+name;
    }
    //重写compareTo方法
    public int compareTo(Object obj){
        Student student=(Student)obj;
        if(this.num==student.num){
            return 0;
        }else if(this.num>student.getNum()){
            return 1;
        }else {
            return -1;
        }
    }
}


package cn.kgc.kb03.homework10;
import java.util.*;
/**
 * @author:?
 * @date:2019/9/5
 * @aim:按学号进行升序排列
 */
//HashMap本身是不可以排序的,但其子类LinkedHashMap是有序的
//可以利用LinkedHashMap+List+Collections工具实现HashMap排序
public class HashMapSort  {
    public static void main(String[] args) {
        //创建HashMap集合
        HashMap<Integer, Student> hashMap = new HashMap<>();
        //把序号和学员对象按照键值对的方式存储在HashMap中
        hashMap.put(1, new Student(1, "A"));
        hashMap.put(2, new Student(3, "B"));
        hashMap.put(3, new Student(2, "C"));
        hashMap.put(4, new Student(5, "D"));
        hashMap.put(5, new Student(4, "E"));
        //调用sortHashMap()排序并返回新的集合
        HashMap<Integer,Student> sort = sortHashMap(hashMap);
        System.out.println(sort);
    }
    private static HashMap<Integer, Student> sortHashMap(HashMap<Integer, Student> map) {
        //从HashMap中恢复entry集合,得到全部的键值对集合
        Set<Map.Entry<Integer,Student>> entries= map.entrySet();
        //将Set集合转为List集合,为了使用工具类的排序方法
        List<Map.Entry<Integer,Student>> list= new ArrayList<Map.Entry<Integer,Student>>(entries);
        //使用Collections工具类对list进行排序
        //Collections.sort()是一个内置方法,仅排序值的列表。它在Collections类中重载。
         Collections.sort(list, new Comparator<Map.Entry<Integer, Student>>() {
                @Override
                public int compare(Map.Entry<Integer, Student> o1, Map.Entry<Integer, Student> o2) {
                    //按照学号升序排序
                    return o1.getValue().getNum()-o2.getValue().getNum();
                    //return o1.getValue().compareTo(o2.getValue());
                }
            });
            //创建一个HashMap的子类LinkedHashMap集合
        LinkedHashMap<Integer, Student> linkedHashMap= new LinkedHashMap<>();
            //将list中的数据存入LinkedHashMap中
        for(Map.Entry<Integer,Student> entry:list){
            linkedHashMap.put(entry.getKey(),entry.getValue());
        }
        return linkedHashMap;
    }
}
目录
相关文章
|
3月前
|
存储 安全 Java
Java 集合框架中的老炮与新秀:HashTable 和 HashMap 谁更胜一筹?
嗨,大家好,我是技术伙伴小米。今天通过讲故事的方式,详细介绍 Java 中 HashMap 和 HashTable 的区别。从版本、线程安全、null 值支持、性能及迭代器行为等方面对比,帮助你轻松应对面试中的经典问题。HashMap 更高效灵活,适合单线程或需手动处理线程安全的场景;HashTable 较古老,线程安全但性能不佳。现代项目推荐使用 ConcurrentHashMap。关注我的公众号“软件求生”,获取更多技术干货!
63 3
|
4月前
|
Java
Java之HashMap详解
本文介绍了Java中HashMap的源码实现(基于JDK 1.8)。HashMap是基于哈希表的Map接口实现,允许空值和空键,不同步且线程不安全。文章详细解析了HashMap的数据结构、主要方法(如初始化、put、get、resize等)的实现,以及树化和反树化的机制。此外,还对比了JDK 7和JDK 8中HashMap的主要差异,并提供了使用HashMap时的一些注意事项。
181 2
Java之HashMap详解
|
1月前
|
存储 缓存 安全
Java HashMap详解及实现原理
Java HashMap是Java集合框架中常用的Map接口实现,基于哈希表结构,允许null键和值,提供高效的存取操作。它通过哈希函数将键映射到数组索引,并使用链表或红黑树解决哈希冲突。HashMap非线程安全,多线程环境下需注意并发问题,常用解决方案包括ConcurrentHashMap和Collections.synchronizedMap()。此外,合理设置初始化容量和加载因子、重写hashCode()和equals()方法有助于提高性能和避免哈希冲突。
60 17
Java HashMap详解及实现原理
|
5月前
|
存储 Java
Java中的HashMap和TreeMap,通过具体示例展示了它们在处理复杂数据结构问题时的应用。
【10月更文挑战第19天】本文详细介绍了Java中的HashMap和TreeMap,通过具体示例展示了它们在处理复杂数据结构问题时的应用。HashMap以其高效的插入、查找和删除操作著称,而TreeMap则擅长于保持元素的自然排序或自定义排序,两者各具优势,适用于不同的开发场景。
69 1
|
5月前
|
存储 安全 Java
Java Map新玩法:探索HashMap和TreeMap的高级特性,让你的代码更强大!
【10月更文挑战第17天】Java Map新玩法:探索HashMap和TreeMap的高级特性,让你的代码更强大!
119 2
|
5月前
|
存储 Java 开发者
Java Map实战:用HashMap和TreeMap轻松解决复杂数据结构问题!
【10月更文挑战第17天】本文深入探讨了Java中HashMap和TreeMap两种Map类型的特性和应用场景。HashMap基于哈希表实现,支持高效的数据操作且允许键值为null;TreeMap基于红黑树实现,支持自然排序或自定义排序,确保元素有序。文章通过具体示例展示了两者的实战应用,帮助开发者根据实际需求选择合适的数据结构,提高开发效率。
134 2
|
5月前
|
存储 缓存 安全
HashMap VS TreeMap:谁才是Java Map界的王者?
HashMap VS TreeMap:谁才是Java Map界的王者?
207 2
|
2月前
|
Java 程序员
Java 排序神器:Comparable 和 Comparator 该怎么选?
嗨,大家好,我是小米!今天和大家聊一聊Java社招面试中常考的经典问题——Comparable和Comparator的区别。Comparable定义对象的自然排序,适用于单一固定的排序规则;Comparator则是策略接口,用于定义自定义排序规则,适用于多样化或多变的排序需求。掌握这两者的区别是理解Java排序机制的基础,也是面试中的加分题。结合实际项目场景深入探讨它们的应用,能更好地打动面试官。如果你觉得有帮助,欢迎点赞、收藏、分享,期待你的一键三连!我们下期见~ 我是小米,一个喜欢分享技术的程序员,关注我的微信公众号“软件求生”,获取更多技术干货!
54 20
|
5月前
|
Java
用java搞定时任务,将hashmap里面的值存到文件里面去
本文介绍了如何使用Java的`Timer`和`TimerTask`类创建一个定时任务,将HashMap中的键值对写入到文本文件中,并提供了完整的示例代码。
60 1
用java搞定时任务,将hashmap里面的值存到文件里面去
|
5月前
|
存储 Java 程序员
Java面试加分点!一文读懂HashMap底层实现与扩容机制
本文详细解析了Java中经典的HashMap数据结构,包括其底层实现、扩容机制、put和查找过程、哈希函数以及JDK 1.7与1.8的差异。通过数组、链表和红黑树的组合,HashMap实现了高效的键值对存储与检索。文章还介绍了HashMap在不同版本中的优化,帮助读者更好地理解和应用这一重要工具。
157 5