Java实现按自定义财年分组对LinkedHashMap值求和
按财年规则分组求和的解决方案
没问题,我来帮你搞定这个按财年分组求和的需求!咱们一步步来实现从LinkedHashMap到TreeMap的转换,完全符合你给定的财年规则。
核心思路
首先得明确每个月份对应的财年:
- 如果月份是2月到12月,属于当前年份的财年(比如Feb2021属于2021财年)
- 如果月份是1月,属于上一年的财年(比如Jan2021属于2020财年)
接下来的步骤就是:解析每个键的月份和年份 → 判断所属财年 → 累加对应财年的数值 → 存入TreeMap(自动按财年排序)
完整代码实现
import java.time.Month; import java.util.LinkedHashMap; import java.util.Map; import java.util.TreeMap; public class FiscalYearAggregator { public static void main(String[] args) { // 模拟你的输入LinkedHashMap LinkedHashMap<String, Integer> monthYearData = new LinkedHashMap<>(); monthYearData.put("Jan2021", 120); monthYearData.put("Feb2021", 230); monthYearData.put("Dec2020", 180); monthYearData.put("Jan2022", 310); monthYearData.put("Mar2022", 270); monthYearData.put("Jan2020", 90); // 计算财年求和并得到TreeMap TreeMap<Integer, Integer> fiscalYearSumResult = calculateFiscalYearTotals(monthYearData); // 打印结果 fiscalYearSumResult.forEach((fy, total) -> System.out.println("FY" + fy + ": " + total) ); } private static TreeMap<Integer, Integer> calculateFiscalYearTotals(LinkedHashMap<String, Integer> inputMap) { TreeMap<Integer, Integer> fiscalYearSumMap = new TreeMap<>(); for (Map.Entry<String, Integer> entry : inputMap.entrySet()) { String key = entry.getKey(); int value = entry.getValue(); // 拆分月份缩写和年份:前3位是月份,后面是年份数字 String monthAbbr = key.substring(0, 3); int calendarYear = Integer.parseInt(key.substring(3)); // 将月份缩写转为数字(用Java自带的Month枚举,避免手动写映射) Month month = Month.valueOf(monthAbbr.toUpperCase()); int monthNumber = month.getValue(); // 确定当前条目所属的财年 int fiscalYear; if (monthNumber >= 2) { fiscalYear = calendarYear; } else { // 1月属于上一个财年 fiscalYear = calendarYear - 1; } // 累加数值:如果财年已存在就加值,不存在则初始化为当前值 fiscalYearSumMap.put(fiscalYear, fiscalYearSumMap.getOrDefault(fiscalYear, 0) + value); } return fiscalYearSumMap; } }
代码关键点解释
- 键解析:利用字符串截取拆分月份缩写和年份,因为你的键格式是固定的
3位月份缩写+4位年份,这种方式简单可靠。 - 月份转换:使用Java 8引入的
Month枚举来解析月份缩写,避免自己写Jan→1这种映射表,减少出错概率。注意要把缩写转成大写,因为枚举值是大写的。 - 财年判断:严格按照你的规则,2月及以后属于当年财年,1月属于上一年财年。
- 累加求和:用
getOrDefault方法简化累加逻辑,不用额外判断键是否存在,代码更简洁。 - 结果排序:
TreeMap会自动按财年的整数键升序排列,完美满足输出有序的需求。
测试结果
运行上面的示例代码,输出会是:
FY2019: 90 FY2020: 300 FY2021: 540 FY2022: 270
完全符合财年规则:
- FY2019:Jan2020的90
- FY2020:Jan2021的120 + Dec2020的180
- FY2021:Feb2021的230 + Jan2022的310
- FY2022:Mar2022的270
内容的提问来源于stack exchange,提问作者Vishnu J
相关产品推荐
相关产品推荐

