我有这个分裂方法,我有一个循环。此循环运行4次,但应运行5次。知道为什么会这样吗?
public static <T> List<List<T>> split(List<T> bigCollection, int maxBatchSize) {
List<List<T>> result = new ArrayList<List<T>>();
if (CollectionUtils.isEmpty(bigCollection)) {
// return empty list
} else if (bigCollection.size() < maxBatchSize) {
result.add(bigCollection);
} else {
for (int i = 0; (i + maxBatchSize) <= bigCollection.size(); i = i + maxBatchSize) {
result.add(bigCollection.subList(i, i + maxBatchSize));
}
if (bigCollection.size() % maxBatchSize > 0) {
result.add(bigCollection.subList((int) (bigCollection.size() / maxBatchSize) * maxBatchSize,
bigCollection.size()));
}
}
return result;
}
public static void main(String[] args) {
List<String> coll = new ArrayList<String>();
coll.add("1");
coll.add("2");
coll.add("3");
coll.add("4");
coll.add("5");
coll.add("6");
coll.add("7");
coll.add("8");
System.out.println(split(coll, 2));
}
输出 - [[1,2],[3,4],[5,6],[7,8]]
根据我的说法,这个代码应该在第五次循环运行时中断并尝试执行子列表功能。
答案 0 :(得分:4)
当您在迭代4时,您的循环条件是这样的:
(i + maxBatchSize) <= bigCollection.size()
6 + 2 <= 8
所以你要进去。但是第五次迭代不再尊重这种情况了,因为它是这样的:
(i + maxBatchSize) <= bigCollection.size()
8 + 2 <= 8
请勿忘记,您的情况不仅仅是i
,而是i + maxBatchSize
答案 1 :(得分:1)
以下for循环
for (int i = 0; (i + maxBatchSize) <= bigCollection.size(); i = i + maxBatchSize) {
result.add(bigCollection.subList(i, i + maxBatchSize));
}
从{0}到bigCollection.size() - maxBatchSize
逐步增加maxBatchSize
。在您的示例中,bigCollection
的大小为8,maxBatchSize
为2,因此循环从0到6逐步为2.总共计算出4个步骤:0,2,4和6。
以下如果
if (bigCollection.size() % maxBatchSize > 0)
未执行,因为8 % 2 = 0
(因此未执行subList
)。