用stream截取List元素中某一个字符串元素字段并转为Date进行List的时间排序

这段代码展示了如何使用Java 8的Stream API对DailyRecords列表进行排序,依据是记录中的时间信息。它首先解析记录中的日期字符串,然后比较两个日期的毫秒值来完成排序。如果遇到日期解析异常,会捕获并打印堆栈跟踪,同时返回0保持原有的顺序。

如题 需求很简单 但是实现起来有些麻烦

// 按打卡时间排序
        List<DailyRecords> recordListSorted = dailyRecords.stream().sorted((o1, o2) -> {
            SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");

            try {
                Date date1 = sdf.parse(o1.getRecordInfo().substring(o1.getRecordInfo().indexOf("time") + 7, o1.getRecordInfo().indexOf("record_type") - 3));
                Date date2 = sdf.parse(o2.getRecordInfo().substring(o2.getRecordInfo().indexOf("time") + 7, o2.getRecordInfo().indexOf("record_type") - 3));

                return Long.compare(date1.getTime(), date2.getTime());
            } catch (ParseException e) {
                e.printStackTrace();
            }
            return 0;
        }).collect(Collectors.toList());
private static List<PpMachiningOrderList> orderList; // 基础排序 orderList.sort(Comparator.comparing(PpMachiningOrderList::getDemandDate) .thenComparing(PpMachiningOrderList::getDohdiff2)); 再过滤出line=AM01-B1/AM01-B2/AM02-B1/AM02-B2的四个列表, 再处理同设备产线数据(AM01/AM02 相同的为同一条 ) 例如处理AM01的两条: // 1. 按 finishedProductNo 分组 Map<String, List<PpMachiningOrderList>> groupedByProduct = orderList.stream() .collect(Collectors.groupingBy(PpMachiningOrderList::getFinishedProductNo)); // 2. 从第一条往后找从第一日往后 mergeDays-1 天的数据合为一组,如果没有,那就有几条算几条 List<List<PpMachiningOrderList>> allGroups = new ArrayList<>(); for (List<PpMachiningOrderList> group : groupedByProduct.values()) { int index = 0; while (index < group.size()) { PpMachiningOrderList firstOrder = group.get(index); Calendar calendar = Calendar.getInstance(); calendar.setTime(firstOrder.getDemandDate()); List<PpMachiningOrderList> currentGroup = new ArrayList<>(); currentGroup.add(firstOrder); if (mergeDays != null) { int daysToMerge = mergeDays.intValue() - 1; if (daysToMerge < 0) { daysToMerge = 0; } // 往后找 mergeDays-1 天的数据 for (int i = 1; i <= daysToMerge; i++) { calendar.add(Calendar.DAY_OF_YEAR, 1); Date targetDate = calendar.getTime(); for (int j = index + 1; j < group.size(); j++) { PpMachiningOrderList order = group.get(j); if (order.getDemandDate().equals(targetDate)) { currentGroup.add(order); break; } } } } allGroups.add(currentGroup); index += currentGroup.size(); } } 也就是将相同finishedProductNo的mergeDays天的分组, 接着就是对同设备的两个List<List<PpMachiningOrderList>> allGroups 比较: 一组一组一一对比, 找出两组数据中, private BigDecimal manualQty;最小的一个PpMachiningOrderList对象的 private String oee; private String ct;(ct和oee都是字符串数字), 然后重新设置另一组的PpMachiningOrderList对象的 private BigDecimal totalTime: totalTime = BigDecimalUtils.getDecimal(this.qty.multiply(BigDecimalUtils.getDecimal(this.ct)).divide(BigDecimalUtils.getDecimal(this.oee), 0, RoundingMode.CEILING)); this.qty 是PpMachiningOrderList对象的 private BigDecimal qty;; 处理完成后,这样同设备的第一组数据两边的节拍就一致了, 在比较两边的totalTime 占用时间之和是否一致, 如果一致就处理第二组; 如果不一致, 就将大的那组超出的部分截取: 超出的部分可能不是完整的一条PpMachiningOrderList对象, 截取的部分新建一条PpMachiningOrderList对象, 新对象的totalTime 是截取出来的部分, 被截取的PpMachiningOrderList对象的totalTime 要减去相应部分; 截取的部分应该是List<PpMachiningOrderList>, 把这个List<PpMachiningOrderList>添加到allGroups 的 下一组对应的line的前面;
10-21
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值