如何将同一年份的几个季度信息进行归类

我们常常有这样子的一个需求就是需要统计同一个时间,然后这个时间段内又有不同的数据的时候我们应该怎么去统计呢,这就有一个比较通用的版本。

比如说我现在的需求是这样子的,计算出每个年份的剂量值,每个年份分为4个季度,每个季度中有个有效值,年份的剂量值等于4个季度中的有效值之和。那么我们就可以这样子做,但是如果说是你有着更加复杂的算法,那么你也可以是进行方法的改造一下。整体来说这就是一个映射的过程通过设置map不断的去映射。

//计算个人当年剂量
    public BigDecimal calculateAnnualSum(Map<Integer, BigDecimal> quarterlySums) {
        BigDecimal annualSum = BigDecimal.ZERO;
        for (BigDecimal quarterlySum : quarterlySums.values()) {
            annualSum = annualSum.add(quarterlySum);
        }
        return annualSum;
    }

    public Map<Integer, Map<Integer, BigDecimal>> calculateSums(List<InfoRadiationMonitorNew> dataList) {
        // 创建一个映射来存储每个年份每个季度的总和
        Map<Integer, Map<Integer, BigDecimal>> yearlyQuarterlySums = new HashMap<>();
        for (InfoRadiationMonitorNew data : dataList) {
            Integer year = data.getMonitorYear();  // 获取年份
            Integer quarter = data.getMonitorPeriod();  // 获取季度
            BigDecimal measurement = data.getAccurateMeasurement();  // 获取有效计量
            // 确保年份映射存在
            yearlyQuarterlySums.putIfAbsent(year, new HashMap<>());
            // 确保季度映射存在,如果不存在则初始化为 0
            yearlyQuarterlySums.get(year).putIfAbsent(quarter, BigDecimal.ZERO);
            // 更新总和
            yearlyQuarterlySums.get(year).put(quarter, yearlyQuarterlySums.get(year).get(quarter).add(measurement));
        }
        return yearlyQuarterlySums;
    }

使用的时候:
 

  // 计算年个人剂量当量
                Map<Integer, Map<Integer, BigDecimal>> yearlyQuarterlySums = calculateSums(addlist);  // 获取每个年份每个季度的 accurateMeasurement 之和
                addlist.forEach(a -> {
                    Integer year = a.getMonitorYear();  // 获取当前数据的年份
                    Map<Integer, BigDecimal> quarterlySums = yearlyQuarterlySums.get(year);  // 获取这个年份的季度之和
                    if (ObjectUtil.isNotEmpty(quarterlySums)) {
                        BigDecimal annualSum = calculateAnnualSum(quarterlySums);  // 计算这个年份的 annualSum
                        a.setAnnualDoseEquivalent(annualSum);  // 为当前数据设置 annualDoseEquivalent 字段
                    }
                });

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值