Java循环奇怪的行为

时间:2015-08-17 08:08:54

标签: java for-loop logic

我有这个分裂方法,我有一个循环。此循环运行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]]

根据我的说法,这个代码应该在第五次循环运行时中断并尝试执行子列表功能。

2 个答案:

答案 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)。