List去重复(多个字段)

List去重复 ,我们首先想到的可能是 利用List转Set 集合,因为Set集合不允许重复。 所以达到这个目的。 如果集合里面是简单对象,例如Integer、String等等,这种可以使用这样的方式去重复。但是如果是复杂对象,即我们自己封装的对象。用List转Set 却达不到去重复的目的。 所以,回归根本。 判断Object对象是否一样,我们用的是其equals方法。 所以我们只需要重写equals方法,就可以达到判断对象是否重复的目的。

package com.ischen.demo.utils;

/**
 * @Author:ischen
 * @Date 2019/8/27 15:26
 * @Describe
 */


import org.apache.commons.collections.CollectionUtils;

import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;


public class TestCollection {

    //去重复之前集合
    private static  List<User> list = Arrays.asList(
            new User("张三", BigDecimal.valueOf(35.6), 18),
            new User("李四", BigDecimal.valueOf(85), 30),
            new User("赵六", BigDecimal.valueOf(66.55), 25),
            new User("赵六", BigDecimal.valueOf(66.55), 25),
            new User("张三", BigDecimal.valueOf(35.6), 18));

    public static void main(String[] args) {
        //排除重复
        getNoRepeatList(list);

    }

    /**
     * 去除List内复杂字段重复对象
     * @author : shijing
     * 2017年6月2日上午11:28:20
     * @param oldList
     * @return
     */
    private static List<User> getNoRepeatList(List<User> oldList){
        List<User> list = new ArrayList<>();
        if(CollectionUtils.isNotEmpty(oldList)){
            for (User user : oldList) {
                //list去重复,内部重写equals
                if(!list.contains(user)){
                    list.add(user);
                }
            }
        }

        //输出新集合
        System.out.println("去除重复后新集合:");
        if(CollectionUtils.isNotEmpty(list)){
            for (User user : list) {
                System.out.println(user.toString());
            }
        }
        return list;
    }

    static class User{
        private String userName; //姓名
        private BigDecimal score;//分数
        private Integer age;
        public String getUserName() {
            return userName;
        }
        public void setUserName(String userName) {
            this.userName = userName;
        }
        public BigDecimal getScore() {
            return score;
        }
        public void setScore(BigDecimal score) {
            this.score = score;
        }
        public Integer getAge() {
            return age;
        }
        public void setAge(Integer age) {
            this.age = age;
        }
        public User(String userName, BigDecimal score, Integer age) {
            super();
            this.userName = userName;
            this.score = score;
            this.age = age;
        }
        public User() {
            // TODO Auto-generated constructor stub
        }

        @Override
        public String toString() {
            // TODO Auto-generated method stub
            return "姓名:"+ this.userName + ",年龄:" + this.age + ",分数:" + this.score;
        }

        /**
         * 重写equals,用于比较对象属性是否包含
         */
        public boolean equals(Object obj) {
            if (obj == null) {
                return false;
            }
            if (this == obj) {
                return true;
            }
            User user = (User) obj;
            //多重逻辑处理,去除年龄、姓名相同的记录
            if (this.getAge() .compareTo(user.getAge())==0
                    && this.getUserName().equals(user.getUserName())
                    && this.getScore().compareTo(user.getScore())==0) {
                return true;
            }
            return false;
        }
    }

}
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值