List<T>中根据实体的属性去重

该博客介绍了如何在Java中通过不同的方法实现List中人员实体的去重,特别是在存在优先级的情况下,如何确保外出人员(具有负状态)优先保留。文章提供了四种方法,包括循环遍历、重写比较器、使用TreeSet和HashSet,最后通过示例代码详细解释了每种方法的实现过程。
摘要由CSDN通过智能技术生成

背景: 想要得到 统计所有人在房间情况,集合personOutList为所有外出人员统计,集合personAllList为所有房间人员统计,简而言之personOutList(优先级更高)  覆盖personAllList人员id相同的数据

实现方法:推荐 distinctByCompare2 写法更简洁

package com.wang;

import lombok.Builder;
import lombok.Data;

/**
 * 人员实体
 *
 * @author wangyl
 * @date 2020年12月15日
 */
@Builder
@Data
public class PersonEntity {

    /**
     * 用户id
     */
    private String userId;
    /**
     * 用户名字
     */
    private String userName;
    /**
     * 用户状态 -1 出去 1 进来
     */
    private String userStatus;
    /**
     * 房间号码
     */
    private String roomNumber;
}
package com.wang;

import java.util.*;
import java.util.stream.Collectors;

/**
 * List中根据某个实体的属性去重
 *
 * @author wangyl
 * @date 2020年12月15日
 */
public class ListDistinct {
    
    public static void main(String[] args) {
        // 构建实体对象 模拟从数据查到的数据 注意这里张三这个人外出状态有两个 一个是1 一个是-1 最后只是想要-1的数据
        PersonEntity person1 = PersonEntity.builder().userId("1").userName("张三").userStatus("1").roomNumber("101").build();
        PersonEntity person_1 = PersonEntity.builder().userId("1").userName("张三").userStatus("-1").roomNumber("101").build();
        PersonEntity person2 = PersonEntity.builder().userId("2").userName("李四").userStatus("1").roomNumber("101").build();
        PersonEntity person3 = PersonEntity.builder().userId("3").userName("王五").userStatus("1").roomNumber("102").build();
        // personAllList添加实体 全部人员
        List<PersonEntity> personAllList = new ArrayList<>();
        personAllList.add(person1);
        personAllList.add(person2);
        personAllList.add(person3);
        // personOutList添加实体 外出人员
        List<PersonEntity> personOutList = new ArrayList<>();
        personOutList.add(person_1);
        // 声明返回实体
        List<PersonEntity> personReturnList;
        // 方法一
        // personReturnList=compareByFor(personAllList,personOutList);
        personOutList.addAll(personAllList);
        // 方法二
        personReturnList = distinctByCompare1(personOutList);
        // 方法三【推荐】其实和方法二一样 但lambda版本更简洁
        // personReturnList=distinctByCompare2(personOutList);
        // 方法四
        // personReturnList=distinctBySet(personOutList);

        Map<String, List<PersonEntity>> map = personReturnList.stream().collect(Collectors.groupingBy(PersonEntity::getRoomNumber));
        System.out.println(map.toString());
    }
    /**
     * 循环写法
     *
     * @param personAllList 全部人员集合
     * @param personOutList 外出人员集合
     * @return 去重后集合
     */
    public static <T extends PersonEntity> List<T> compareByFor(List<T> personAllList, List<T> personOutList) {
        List<T> personReturnList = new ArrayList<>();
        for (T personAll : personAllList) {
            boolean flag = false;
            for (PersonEntity personOut : personOutList) {
                if (personOut.getUserId().equals(personAll.getUserId())) {
                    flag = true;
                    continue;
                }
            }
            if (flag == false) {
                personReturnList.add(personAll);
            }
        }
        personReturnList.addAll(personOutList);
        return personReturnList;
    }

    /**
     * 重写compare 方法
     *
     * @param oldList 去重复前集合
     * @return 去重后集合
     */
    public static <T extends PersonEntity> List<T> distinctByCompare1(List<T> oldList) {
        Set<T> set = new TreeSet<>(new Comparator<T>() {
            @Override
            public int compare(T o1, T o2) {
                return o1.getUserId().compareTo(o2.getUserId());
            }
        });
        set.addAll(oldList);
        return new ArrayList<>(set);
    }

    /**
     * 重写compare 方法
     *
     * @param oldList 去重复前集合
     * @return 去重后集合
     */
    public static <T extends PersonEntity> List<T> distinctByCompare2(List<T> oldList) {
        Set<T> set = new TreeSet<>(Comparator.comparing(PersonEntity::getUserId));
        set.addAll(oldList);
        return new ArrayList<>(set);
    }

    /**
     * 使用Set实现List<Student>中stuName字段去重 </br>
     *
     * @param oldList
     * @return
     */
    public static <T extends PersonEntity> List<T> distinctBySet(List<T> oldList) {
        Set<String> set = new HashSet<>();
        List<T> newList = new ArrayList<>();
        for (T t : oldList) {
            if (!set.contains(t.getUserId())) {
                set.add(t.getUserId());
                newList.add(t);
            }
        }
        return newList;
    }
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

一棵小白菜#

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值