ratio List每个元素对应字段的加和总数和元素自身的对应字段在总和里所占的比例 需要一个方法计算
时间: 2024-09-25 14:19:19 浏览: 24
你希望编写一个方法,该方法接受一个`BusOppNumsRes`对象的列表,计算每个对象中特定`ratio`字段(如allMoneyRatio、allNumsRatio等)的值之和,并返回每个元素在总和中所占比率。我们可以按照以下方式设计这个方法:
首先,我们需要一个辅助方法来计算单个对象的`ratio`值在总和中的占比:
```java
private double calculateRatioPercentage(BusOppNumsRes obj, BigDecimal totalSum) {
if (totalSum.compareTo(BigDecimal.ZERO) == 0) {
return 0.0; // 总和为0的情况避免除以0异常
} else {
return obj.getRatioField().doubleValue() / totalSum.doubleValue(); // 使用double类型确保比例计算精确
}
}
```
这里的`getRatioField()`应该根据实际的`ratio`字段名字替换,比如`getAllMoneyRatio()`或`getAllNumsRatio()`。
然后,主方法`calculateTotalAndPercentages(List<BusOppNumsRes> list)`可以这样实现:
```java
public Map<String, Pair<Double, Double>> calculateTotalsAndPercentages(List<BusOppNumsRes> busOppNumsList) {
Map<String, BigDecimal> totals = new HashMap<>();
Map<String, Double> percentages = new HashMap<>();
// 计算总和
BigDecimal sum = BigDecimal.ZERO;
for (BusOppNumsRes busOppNums : busOppNumsList) {
totals.putIfAbsent(busOppNums.getName(), BigDecimal.ZERO);
totals.get(busOppNums.getName()).add(busOppNums.getRatioField());
sum = sum.add(busOppNums.getRatioField());
}
// 计算百分比
for (BusOppNumsRes busOppNums : busOppNumsList) {
String ratioName = busOppNums.getName();
BigDecimal objTotal = totals.get(ratioName);
double percentage = calculateRatioPercentage(busOppNums, sum);
percentages.put(ratioName, percentage);
}
// 包装成Pair以便返回
Map<String, Pair<Double, Double>> result = new HashMap<>();
for (Map.Entry<String, Double> entry : percentages.entrySet()) {
result.put(entry.getKey(), new Pair<>(objTotal.doubleValue(), entry.getValue()));
}
return result;
}
```
这个方法会返回一个映射,键是比率字段名,值是一个包含两个部分的元组:总和和该比率在总和中所占的百分比。
阅读全文