List去重复——多个复杂字段判断去重

本文介绍了一种在Java中去除List集合中重复元素的有效方法,特别是针对自定义对象的情况。通过重写equals方法来判断复杂对象是否相等,并提供了一个具体的实现案例。

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

package com.test;

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

import org.apache.commons.collections.CollectionUtils;

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;  
    }  
}

}

执行结果:
去除重复后新集合:
姓名:张三,年龄:18,分数:35.6
姓名:李四,年龄:30,分数:85
姓名:赵六,年龄:25,分数:66.55

转载于:https://blog.51cto.com/13545923/2053322

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值