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

Java拆分List时索引逻辑错误导致元素丢失问题求助

问题根源

你出现元素丢失是两个错误叠加导致的:

  1. Java的List.subList(fromIndex, toIndex)方法为左闭右开区间规则:返回的子列表包含fromIndex对应元素,不包含toIndex对应元素,子列表的实际大小为toIndex - fromIndex。
  2. 你主动将下一段的起始索引设置为上一段结束索引+1,相当于每拆分一段就跳过1个元素,拆分3段总共丢失3个元素,和你少的数量完全吻合:
    • 第一段subList(0,949)实际包含元素索引为0~948,你直接从950开始第二段,跳过了索引949的元素
    • 第二段subList(950,1899)实际包含元素索引为950~1898,你直接从1900开始第三段,跳过了索引1899的元素
    • 第三段subList(1900,2846)实际包含元素索引为1900~2845,跳过了最后一个索引2846的元素

正确拆分逻辑

拆分时不需要加1,上一段的结束索引直接作为下一段的起始索引即可,最后一段的结束索引直接传入原列表的总大小(subList允许toIndex等于列表总大小,刚好取到最后一个元素)。

针对你的场景修改后的代码:

int size   = MASTER_LINE_LIST.size();
int third  = size / 3;
int start1 = 0;
int end1   = start1 + third;
int start2 = end1; // 直接用上一段的end作为start,不需要+1
int end2   = start2 + third;
int start3 = end2;
int end3   = size; // 直接传总大小,不需要减1

List<String> lineListSub0 = MASTER_LINE_LIST.subList(start1, end1);
List<String> lineListSub1 = MASTER_LINE_LIST.subList(start2, end2);
List<String> lineListSub2 = MASTER_LINE_LIST.subList(start3, end3);

更通用的拆分方案(适配Google翻译API 1024元素限制)

建议写通用拆分工具方法,不需要写死分成3份,避免后续列表长度超过3*1024时再次出错:

/**
 * 按最大元素数拆分列表
 * @param original 原列表
 * @param maxSize 每个子列表最大元素数
 * @return 拆分后的子列表集合
 */
public static <T> List<List<T>> splitList(List<T> original, int maxSize) {
    List<List<T>> result = new ArrayList<>();
    int size = original.size();
    for (int i = 0; i < size; i += maxSize) {
        int end = Math.min(i + maxSize, size);
        result.add(original.subList(i, end));
    }
    return result;
}

// 使用示例:按Google翻译API最大1024限制拆分
List<List<String>> splitLists = splitList(MASTER_LINE_LIST, 1024);

内容的提问来源于stack exchange,提问作者Michael Sims

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.03 02:27:03