JAVA集合框架细节大全-Map/List排序-Comparable和Comparator区别

Map排序:

Map<String, BigInteger> resMap = getMap();
//排序:
TreeMap<String, BigInteger> sortedMap = new TreeMap<>(resMap);//有序集合

LinkedHashMap是按照插入顺序排序,而TreeMap是按照Key的自然顺序或者Comprator的顺序进行排序。 

                 分组后排序:

List排序(Comparator):

    @Test
    void getCache(){
        String keyOfRedis = "LifeCycleAutoCall_1";
        Object obj = redisUtil.get(keyOfRedis);
        if(obj == null ){
            return;
        }
        List<Long> longs = (List<Long>)obj;
        System.err.println("longs="+longs.toString());
        //查询key是否已存在,存在间隔小于最小时间间隔的发送记录跳过本次发送
        //不存在记录key,有效期1天
        if(!CollectionUtils.isEmpty(longs)) {
            Collections.sort(longs, new Comparator<Long>() {
                @Override
                public int compare(Long o1, Long o2) {
                    //升序
                    if (o1 < o2) {
                        return -1;
                    } else {
                        return 1;
                    }
                    /*//降序
                    if (o1 < o2) {
                        return 1;
                    } else {
                        return -1;
                    }*/
                }
            });

            System.out.println("longs1=" + longs.toString());
            longs.sort(new Comparator<Long>() {
                @Override
                public int compare(Long o1, Long o2) {
                    /*return o1.compareTo(o2);//升序*/
                    return o2.compareTo(o1);//降序
                }
            });

            System.out.println("longs2=" + longs.toString());
            Long MaxDate = longs.get(0);
            System.out.println("MaxDate=" + MaxDate.toString());
        }
    } 

activityIdList.sort((a, b) -> a.compareTo(b));//升序【简写】

//List集合按照(日期-对象的属性)进行排序
Collections.sort(list, new Comparator<HighPerformanceCouponResultDTO>() {
  @Override
  public int compare(HighPerformanceCouponResultDTO o1,                         HighPerformanceCouponResultDTO o2) {
    //比较规则:compare(a,b)方法:根据第一个参数小于、等于或大于第二个参数分别返回负整数、零或正整数。
    if (isBefore(o1.getDate(), o2.getDate(), "yyyy-MM-dd")) {
      return -1;
    }
    return 1;
  }
});

去重(并保持原先顺序):

//Set去重并保持原先顺序的两种方法
public static void delRepeat(List<String> list) {
  //方法一
  List<String> listNew = new ArrayList<String>(new TreeSet<String>(list));
  //方法二
  List<String> listNew2 = new ArrayList<String>(new LinkedHashSet<String>(list));
}

new的都是深拷贝,引用和引用强转赋值的都是浅拷贝 :

@Test
  void run () {
    List<String> list = new ArrayList();
    list.add("毛茸茸");

    //List<Object> deepList  = new ArrayList<>(list);//深拷贝
    List<Object> deepList  = new ArrayList<>();
    deepList.addAll(list);//深拷贝
    List<Object> shallowList = (List<Object>)(List)list;//浅拷贝

    /*System.out.println(list == deepList);
    System.out.println(list == shallowList);*/

    System.out.println("deepList="+deepList);
    System.out.println("shallowList="+shallowList);
    list.set(0,"冷冰冰");
    System.out.println("deepList="+deepList);
    System.out.println("shallowList="+shallowList);
  }

map的forEach()方法:


Comparable和Comparator区别:

一、相同点:

两者都是用作对象之间的比较和排序,都可以自定义比较规则。
两者都是返回一个描述对象之间关系的int。

二、区别:

  • Comparable是java.lang包下的,Comparator是java.util包的。
  • 实现Comparable接口必须重写compareTo(T o)方法,实现Comparator接口必须重写compare(T o1,T o2)方法。.
  • Comparable是内在比较器,实现这个接口的类的对象可以直接比较:this.compareTo(this),这个类也支持排序,由该类对象组成的集合可以直接使用Collections.sort方法排序,此外,“实现Comparable接口的类的对象”可以用作“有序映射(如TreeMap)”中的键或“有序集合(TreeSet)”中的元素,而不需要指定比较器。Comparator是外在比较器,如果想比较两个类又没有实现Comparable或者想实现自定义排序的,可以用Comparator。
  • Comparator与Comparable同时存在的情况下,比较器Comparator优先级高。
  • 使用Comparable需要修改原先的实体类,是属于一种自然排序,而Comparator 是实现一个新的比较器是不用修改原先的类的 。Comparator实际应用广。

通俗来说,如果一个实体类实现了Comparable接口来实现排序规则,使用一段时间后,如果想去改变这个排序规则,基于“开闭原则”对修改关闭对扩展开放,我们提倡通过实现Comparator接口来定义新的排序规则让实体类去采纳,使用一段时间后,如果还想改变,再通过Comparator接口实现一个新的排序规则即可(Comparator符合行为型设计模式中的--策略模式)。不影响类的封装性,易于扩展。


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值