去重 java 集合: java 集合中元素根据 A 属性去重,保留 B 属性是某一个值的元素 - 知乎

本文介绍了如何使用Java Stream API和SQL查询来处理实体类集合的去重问题,同时确保保留每个分组中时间最新的记录。通过Java代码示例展示了如何根据姓名分组并排序,然后选择每组的第一个元素(即时间最新的记录)。同时,也给出了Oracle SQL查询的解决方案,利用row_number()函数实现分组内按时间降序取第一条记录。
摘要由CSDN通过智能技术生成

遇到这样一个问题,一个实体类集合, 该集合需要根据姓名剔除重复的值,要求保留重复值中时间最新的那一条数据(去重并按时间排序取第一条)

解决问题的思路记录如下:

  1. 根据姓名进行元素的分组,每一组是相同名字的集合元素
  2. 排序每一组中的元素根据时间降序排列
  3. 依次获取每组当中的第一个元素

代码解决

java 中提供了 stream 流可以很方便的解决分组,排序问题,下面提供 demo 代码如下记录:

         //定义一个新集合,放置去重后的值
    List<User> filterUser = new ArrayList<>();
    // 根据名字分组用户
    Map<String,List<User>> groupByUsers = users.stream().
            collect(Collectors.groupingBy(User::getName));
    Set<Map.Entry<String,List<User>>> enties = groupByUsers.entrySet();
    for (Map.Entry<String,List<User>> entry : enties) {
        
        // 获取每一个分组用户
        List<User> values = entry.getValue();
        
        // 每一个组中就一个元素的时候,不用排序
        if (values.size() == 1)
            filterUser.addAll(values);
        else{
            // 获取第一个值,根据时间降序排列
            User firstUser = values.stream().sorted(Comparator.comparing(User::getBirthday).reversed()).findFirst().get();
            filterUser.add(firstUser);
        }
    }

sql 解决

具体解决方案参考一篇文章

oracle 去重并按时间排序取第一条

关键性 sql 记录如下:

select  t.*
   from (select a.*, row_number() over(partition by col1需要分组的字段 order by col2更新时间 desc) rw
           from 表 a) t
  where t.rw = 1

row_number()over(partition by col1 order by col2)表示根据col1分组,在分组内部根据col2排序,而此函数计算的值就表示每组内部排序后的顺序编号(组内连续的唯一的)。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值