List集合去重的几种方式

前言:

在实际开发中我们使用集合,常常会遇到**一个容器中会出现多个重复的对象**
那么我们可以通常传统的办法将重复的对象去除,也可以使用java中的对象方法进行业务的需求,下面就来说一说:
首先:
准备实体类

public class penBean {
    private String type;
    private String color;
    public penBean(String type,String color){
        this.type = type;
        this.color = color;
    }

    public String getType() {
        return type;
    }

    public void setType(String type) {
        this.type = type;
    }

    public String getColor() {
        return color;
    }

    public void setColor(String color) {
        this.color = color;
    }
    @Override
    public String toString() {
        return "penBean{" +
                "type='" + type + '\'' +
                ", color='" + color + '\'' +
                '}';
    }
}
1.传统的方式
  List<penBean> penBeanList = new ArrayList<penBean>();
        //添加数据
        penBeanList.add(new penBean("铅笔", "黑色"));
        penBeanList.add(new penBean("中性笔", "黄色"));
        penBeanList.add(new penBean("铅笔", "黑色"));
        penBeanList.add(new penBean("水彩笔", "蓝色"));
        penBeanList.add(new penBean("中性笔", "黄色"));
        //新集合
        List<penBean> newPenBean = new ArrayList<penBean>();
        //遍历集合
        for (penBean penBean : penBeanList) {
        //判断新集合是否为空
            if (newPenBean.isEmpty()){
                newPenBean.add(penBean);
            }else{
                //设置标记
                boolean flag = false;
                //如果不为空,就循环新集合判断对象属性是否重复,如果重复该标记为true,跳过此循环
                for (penBean bean : newPenBean) {
                    if (bean.getType().equals(penBean.getType()) && bean.getColor().equals(penBean.getColor())){
                        flag=true;
                        break;
                    }
                }
                //如果不重复直接添加数据
                if (!flag) {
                    newPenBean.add(penBean);
                }
            }
        }
        System.out.println("新数据");
        for (penBean penBean : newPenBean) {
            System.out.println(penBean.toString());
        }

新数据
penBean{type=‘铅笔’, color=‘黑色’}
penBean{type=‘中性笔’, color=‘黄色’}
penBean{type=‘水彩笔’, color=‘蓝色’}

虽然结果是我们想要看到的,但是代码有点繁琐,如果我们可以通常运用面向对象的想象岂不是很简单。

2.使用contains方法

使用contains方法 切记要重写equals方法,不然每次返回的结果都是false,原因如下

 List<penBean> penBeanList = new ArrayList<penBean>();
        //添加数据
        penBeanList.add(new penBean("铅笔", "黑色"));
        penBeanList.add(new penBean("中性笔", "黄色"));
        penBeanList.add(new penBean("铅笔", "黑色"));
        penBeanList.add(new penBean("水彩笔", "蓝色"));
        penBeanList.add(new penBean("中性笔", "黄色"));

        List<penBean> newPenBean = new ArrayList<penBean>();
     	//遍历集合
        for (penBean penBean : penBeanList) {
        //判断新集合中是否存在一样的对象存在返回true
            if (!newPenBean.contains(penBean)){
                newPenBean.add(penBean);
            }
        }
        System.out.println("新数据");
        for (penBean penBean : newPenBean) {
            System.out.println(penBean.toString());
        }

如果传入的对象的属性是个null值,直接返回的值为-1
如果传入的对象的属性是不为null值,进入else里面 然后进入equals方法这也就是为什么要重写equals方法,在equals方法判断,属性值是否重复,重复返回return i,i=0,

如果不重写就只是执行object类静态的方法equals(),返回结果也是return i,i=0 也就是永远返回false,那么每一条数据都将添加到新集合中

源码的执行顺序:

//执行contains方法 
public boolean contains(Object o) {
        return indexOf(o) >= 0;
 }
 public int indexOf(Object o) {
        if (o == null) {
            for (int i = 0; i < size; i++)
                if (elementData[i]==null)
                    return i;
        } else {
            for (int i = 0; i < size; i++)
                //如果传入的对象属性不为null执行该语句,
                //第一次新集合没有任何数据直接返回-1,添加第一条数据,
                //如果即将添加的数据和新集合里面数据重复则返回return i i值为0
                if (o.equals(elementData[i]))//调用重写的方法
                    return i;
        }
        return -1;
  }

//重写的方法
  @Override
    public boolean equals(Object object) {
        if (this == object) return true;
        if (object == null || getClass() != object.getClass()) return false;
        penBean penBean = (penBean) object;
        //type和color内容相等的时候才返回true
        return Objects.equals(type, penBean.type) &&
                Objects.equals(color, penBean.color);
    }

 //执行object类中静态方法equals
 public static boolean equals(Object a, Object b) {
        return (a == b) || (a != null && a.equals(b));
    }

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值