实现对HashMap集合的排序(正序、倒序、多条件排序)

1: 集合排序需要用的 List.sort();方法,所以要把HashMap转为List

map.entrySet:
就是把(key-value)作为一个整体一对一对地存放到Set集合当中;
Set类型应为:Set<Map.Entry<Integer, User>>

        Set<Map.Entry<Integer, User>> entrySet = map.entrySet(); ★ 先把HashMap转为Set ★
        List<Map.Entry<Integer, User>> list = new ArrayList<>(entrySet); ★ 在=再把Set转为list ★

2:排序方法中Comparator的o1与o2值,就是集合中两个相比较的元素(或则此元素的某个属性)

  • o1-o2是正序;
  • o2-o1是倒序;
  • o1与o2相等时,表示两个元素的比较条件想等了,你可以在指定其他的比较条件
list.sort(new Comparator<Map.Entry<Integer, User>>() {
            @Override
            public int compare(Map.Entry<Integer, User> o1, Map.Entry<Integer, User> o2) {
                ★ 首先按年龄正序排列 ★
                int i = o1.getValue().getAge() - o2.getValue().getAge();
                ★ 如果年龄相等,就按id的正序排列 ★ 
                if (i == 0) { 
                    return o1.getValue().getId() - o2.getValue().getId();
                }
                return i;
            }
        });

3:HashMap是无序的所以需要它的子类LinkedHashMap来接收排好顺序的集合

  • 先创建一个LinkedHashMap作为返回值;
  • 然后对数据进行排序;
  • 排序完把数据装进LinkedHashMap中;
private static Map<Integer, User> sort(Map<Integer, User> map) {
        LinkedHashMap<Integer, User> linkedHashMap = new LinkedHashMap<>();
       /*   此处是排序操作   */
        for (int i = 0; i < list.size(); i++) {
            linkedHashMap.put(list.get(i).getKey(), list.get(i).getValue());
        }
        return linkedHashMap;
    }

源码:

 public static void main(String[] args) {
        // 需要排序的map集合
        Map<Integer, User> map = new HashMap<>();
        map.put(1, new User("张三", 1, 0));
        map.put(2, new User("李四", 2, 1));
        map.put(3, new User("刘罗锅", 3, 2));
        map.put(4, new User("李大爷", 4, 3));
        map.put(5, new User("王二婶", 5, 6));
        map.put(6, new User("老王", 5, 5));
        
        System.out.println("未排序的Map:" + map);
        //把排序完的linkedHashMap赋值给map1
        Map<Integer, User> map1 = sort(map); 
        System.out.println("排序后的Map:" + map1);
    }
    
    // 排序的方法(返回值为HashMap的子类LinkedHashMap; 原因:HashMap无序;LinkedHashMap有序)
    private static Map<Integer, User> sort(Map<Integer, User> map) {
        //先创建一个LinkedHashMap作为返回值
        LinkedHashMap<Integer, User> linkedHashMap = new LinkedHashMap<>();
        //map.entrySet:就是把(key-value)作为一个整体一对一对地存放到Set集合当中
        Set<Map.Entry<Integer, User>> entrySet = map.entrySet(); 
        //ArrayList构造函数接受一个Collection类型的参数,Set是Collection的子类,所以可以把Set对象直接放入转成list
        List<Map.Entry<Integer, User>> list = new ArrayList<>(entrySet);
        //list对象可以通过sort方法进行排序
        list.sort(new Comparator<Map.Entry<Integer, User>>() {
            @Override
            public int compare(Map.Entry<Integer, User> o1, Map.Entry<Integer, User> o2) {
                // o1-o2是正序;o2-o1是倒序; 
                int i = o1.getValue().getAge() - o2.getValue().getAge();
                if (i == 0) { //当i==0时说明上面的排序条件相等了,你可以通过其他条件来排序这个相等的元素;
                    return o1.getValue().getId() - o2.getValue().getId();
                }
                return i;
            }
        });
        for (int i = 0; i < list.size(); i++) { //排序完成,把list添加到刚刚创建的linkedHashMap中
            linkedHashMap.put(list.get(i).getKey(), list.get(i).getValue());
        }
        return linkedHashMap; 
    }

结果:

未排序的Map:{1=User@1218025c, 2=User@816f27d, 3=User@87aac27, 4=User@3e3abc88, 5=User@6ce253f1, 6=User@53d8d10a}
排序后的Map:{1=User@1218025c, 2=User@816f27d, 3=User@87aac27, 4=User@3e3abc88, 6=User@53d8d10a, 5=User@6ce253f1}

Ps:排序中还可以比较字符串进行排序(比较的是字符串长度):
使用compareTo方法对字符串排序,compareTo返回一个int值;
用法: str1.compareTo(str2);

  • 返回值 等于0 说明str1==str2
  • 返回值 小于0 str1<str2
  • 返回值 大于0 说明str1>str2

例如:

        String s1 = "String";
        String s2 = "String";
        String s3 = "String123";
 
        int result = s1.compareTo( s2 );
        System.out.println(result);
      
        result = s2.compareTo( s3 );
        System.out.println(result);
     
        result = s3.compareTo( s1 );
        System.out.println(result);

结果:

0
-3
3
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值