You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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;
    }
}

代码关键点解释

  1. 键解析:利用字符串截取拆分月份缩写和年份,因为你的键格式是固定的3位月份缩写+4位年份,这种方式简单可靠。
  2. 月份转换:使用Java 8引入的Month枚举来解析月份缩写,避免自己写Jan→1这种映射表,减少出错概率。注意要把缩写转成大写,因为枚举值是大写的。
  3. 财年判断:严格按照你的规则,2月及以后属于当年财年,1月属于上一年财年。
  4. 累加求和:用getOrDefault方法简化累加逻辑,不用额外判断键是否存在,代码更简洁。
  5. 结果排序: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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.08 15:22:56