zoukankan      html  css  js  c++  java
  • 【深入Java基础】HashMap高级用法(一):排序

    HashMap高级用法(一):排序

    根据key排序

    HashMap是无序的,我们可以根据key进行升序或降序。

    1.利用List和Collections来实现排序

    先获取HashMap的keySet,然后将keySet放入List,在由Collections的sort方法进行排序。

       HashMap<Integer,String> hashMap = new HashMap<>();
    
            hashMap.put(400,"dd");
            hashMap.put(3,"cc");
            hashMap.put(2,"bb");
            hashMap.put(1,"aa");
    
            System.out.println(hashMap);
    
            //将keySet放入list
            ArrayList<Integer> list= new ArrayList<>(hashMap.keySet());
            //调用sort方法并重写比较器进行升/降序
            Collections.sort(list, new Comparator<Integer>() {
                @Override
                public int compare(Integer o1, Integer o2) {
                    return o1>o2?1:-1;
                }
            });
    
            Iterator<Integer> iterator = list.iterator();
            //迭代排序后的key的list
            while ((iterator.hasNext())){
                Integer key = iterator.next();
                String value = hashMap.get(key);
                System.out.print(key+"="+value+",");
            }
            System.out.println();

    2.与第一种方法类似,不过是将entrySet放入list后在sort。比较器里取得entrySet的key后在比较,本质不变。

    3.利用TreeMap并重写排序compare排序

    TreeMap是SortedMap基于红黑树的实现,日后在论。

           System.out.println(hashMap);//借用上边的hashMap
            TreeMap<Integer,String> treeMap = new TreeMap<>(new Comparator<Integer>() {
                @Override
                public int compare(Integer o1, Integer o2) {
                    return o1>o2?1:-1;
                }
            });
    
            treeMap.putAll(hashMap);
    
            System.out.println(treeMap);

    根据value排序

    和根据key排序一样,不过是将比较器的比较内容改为比较value的大小。

        ArrayList<Map.Entry<Integer,String>> list = new ArrayList<>(hashMap.entrySet());
            Collections.sort(list, new Comparator<Map.Entry<Integer, String>>() {
                @Override
                public int compare(Map.Entry<Integer, String> o1, Map.Entry<Integer, String> o2) {
                    return o1.getValue().compareTo(o2.getValue());//升序,前边加负号变为降序
                }
            });
    
            Iterator<Map.Entry<Integer,String>> iterator = list.iterator();
            for(Map.Entry<Integer,String> m : list){
                System.out.println(m.getKey()+"="+m.getValue());
            }

    其中排序部分代码:

     Collections.sort(list, new Comparator<Map.Entry<Integer, String>>() {
                @Override
                public int compare(Map.Entry<Integer, String> o1, Map.Entry<Integer, String> o2) {
                    return o1.getValue().compareTo(o2.getValue());//升序,前边加负号变为降序
                }
            });

    可以用lambda表达式简写为:

       Collections.sort(list, (o1, o2) -> {
                return o1.getValue().compareTo(o2.getValue());//升序,前边加负号变为降序
            });

    还可以更简单的写为 :

        Collections.sort(list, Comparator.comparing(Map.Entry::getValue));
  • 相关阅读:
    How can i use iptables on centos 7?
    Running Jenkins behind Nginx
    GPG入门教程
    HTML5 canvas标签-4 灰度直方图的实现
    [转载]手把手用C++解密Chrome80版本数据库
    Delphi
    7-zip Delphi API
    cef对本地web资源打包加密
    CEF3资源重定向、读取加密资源、读取zip资源
    axios设置withCredentials导致“跨域”的解决方案
  • 原文地址:https://www.cnblogs.com/cnsec/p/13286734.html
Copyright © 2011-2022 走看看