List集合中去掉重复

        今天在项目中真正遇到了需要操作List集合,要求去掉List集合中重复的实体类。

        以前在研究的时候,忽略了最最基本的,当时认为太简单了,以至于今天的多次调试。

        好了,先来记录本次操作成功的经验。

        从前端页面传递了一个Array数组到后端,这个Array数组中有超过100条数据,但是这些数据有大量重复的。后端Controller中方法使用List<Entity>接收。因此,当前的List<Entity>的集合长度为100+。

        现在的目标是将这个List<Entity>中的数据重复的全部去掉,却是一筹莫展。Entity实体类的属性起码有15条,如此多的属性如何才能一条一条的去对比它们,难道要遍历此集合,一条属性一条属性的遍历吗?这显然会耗费大量的性能。

        因为Entity这个实体类是以前开发定义的,现在我要用到这个实体类。但是发现这个实体类没有重写hashcode与equals方法。因此我这样做了:

        

@Override
    public int hashCode() {
        //计算一个hashCode由计算此id的值来判断
        if(this.getId() == null){
            return -1;
        }
        return this.getId().intValue();
    }

    //为了判断从hotkey页面传过来的实体是否是同一个
    @Override
    public boolean equals(Object obj) {
        //判断依据为相同的id则认为是同一个快捷键实体
        if (!(obj instanceof Entity)) {
            return false;
        }
        HotKeyEntity hotKeyEntity = (HotKeyEntity) obj;
        if(hotKeyEntity.getId() == null){
            return false;
        }
        if(this.getId() == null){
            return false;
        }
        return this.getId().intValue() == hotKeyEntity.getId().intValue();
    }
        /**
         *  因为前端传过来的数组中封装了每次点击的实体对象
         *  而真正有价值的数据是用户最后一次操作的那个实体对象
         *  因此,需要将此方法上的Entity这个list集合去掉重复
         *  对于实体来说,需要重写hashcode与equals方法
         */
        final Set<HotKeyEntity> set = Sets.newHashSet();
        //去掉重复,倒序遍历。
        int size = hotKeyEntity.size();
        for (int i = size - 1; i >= 0; i--) {
            //已经重写HotkeyEntity的equals方法,如果id一样则认为是一致的
            set.add(hotKeyEntities.get(i));
        }
        //清空
        hotKeyEntities.clear();
        //重新添加
        hotKeyEntities.addAll(set);

        真是纸上得来终觉浅,绝知此事要躬行。以前的 JDK1.7 HashMap集合源代码探索力度看样子不够啊,忽略了最简单却又是最本质的东西。

        

猜你喜欢

转载自blog.csdn.net/yanluandai1985/article/details/80333057