Java拆分List时索引逻辑错误导致元素丢失问题求助
问题根源
你出现元素丢失是两个错误叠加导致的:
- Java的
List.subList(fromIndex, toIndex)方法为左闭右开区间规则:返回的子列表包含fromIndex对应元素,不包含toIndex对应元素,子列表的实际大小为toIndex - fromIndex。 - 你主动将下一段的起始索引设置为上一段结束索引+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
相关产品推荐
相关产品推荐

