Java中locked-up shares计算逻辑错误,求正确实现方案
问题分析与代码修正
问题根源
你的代码逻辑错误在于第二个循环中,每次都是用解锁股总和直接减去当前时间段的解锁股,而非在上一次计算出的限售股基础上递减。比如第三个时间段,你用9000-3000得到6000,但正确逻辑应该是用上一个阶段的7000减去3000得到4000。
修正后的代码
public static List<Long> getLockedUpShares(HashMap<String, String> testcase, String token, List<IPOGridData> ipoGridList) { // 计算所有解锁股的总和 Long totalUnlockShares = 0L; for (IPOGridData data : ipoGridList) { totalUnlockShares += data.getUnlockShares(); } List<Long> lockedUpSharesList = new ArrayList<>(); // 第一个阶段的限售股就是总和 Long currentLockedUp = totalUnlockShares; lockedUpSharesList.add(currentLockedUp); // 遍历每个解锁股,依次递减计算后续阶段的限售股 for (IPOGridData data : ipoGridList) { currentLockedUp -= data.getUnlockShares(); lockedUpSharesList.add(currentLockedUp); } // 移除最后一个多余的元素(遍历完所有解锁股后的递减结果无需保留) lockedUpSharesList.remove(lockedUpSharesList.size() - 1); return lockedUpSharesList; }
逻辑说明
- 先计算所有解锁股的总和
totalUnlockShares,作为第一个阶段的限售股。 - 初始化
currentLockedUp为总和,加入结果列表。 - 遍历每个时间段的解锁股,每次用
currentLockedUp减去当前的解锁股,得到下一个阶段的限售股并加入列表。 - 最后移除最后一个元素(遍历完所有n个解锁股后,会多生成一个无意义的0值,需要删除)。
用你的示例数据测试:
- 初始
currentLockedUp=9000,加入列表 → [9000] - 减去第一个解锁股2000 → 7000,加入列表 → [9000,7000]
- 减去第二个解锁股3000 → 4000,加入列表 → [9000,7000,4000]
- 减去第三个解锁股4000 → 0,加入列表后删除,最终结果就是[9000,7000,4000],完全符合预期。
内容的提问来源于stack exchange,提问作者Pratik
相关产品推荐
相关产品推荐

