Java 循环奇怪的行为
Java loop strange behaviour
我有这个拆分方法,其中有一个循环。这个循环是 运行ning 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]]
根据我的说法,这段代码应该在循环 运行 第五次时中断,它会尝试执行子列表功能。
当你在第 4 次迭代时,你的循环条件是这样的:
(i + maxBatchSize) <= bigCollection.size()
6 + 2 <= 8
所以你要进去了。但是第五次迭代不再遵守这个条件,因为它是这样的:
(i + maxBatchSize) <= bigCollection.size()
8 + 2 <= 8
别忘了您的病情不仅在 i
,而且在 i + maxBatchSize
下面的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
没有执行)。
我有这个拆分方法,其中有一个循环。这个循环是 运行ning 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]]
根据我的说法,这段代码应该在循环 运行 第五次时中断,它会尝试执行子列表功能。
当你在第 4 次迭代时,你的循环条件是这样的:
(i + maxBatchSize) <= bigCollection.size()
6 + 2 <= 8
所以你要进去了。但是第五次迭代不再遵守这个条件,因为它是这样的:
(i + maxBatchSize) <= bigCollection.size()
8 + 2 <= 8
别忘了您的病情不仅在 i
,而且在 i + maxBatchSize
下面的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
没有执行)。