我们常常有这样子的一个需求就是需要统计同一个时间,然后这个时间段内又有不同的数据的时候我们应该怎么去统计呢,这就有一个比较通用的版本。
比如说我现在的需求是这样子的,计算出每个年份的剂量值,每个年份分为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 字段
}
});