【问题标题】:Java loop strange behaviourJava循环奇怪的行为
【发布时间】:2015-08-17 08:08:53
【问题描述】:

我有这个拆分方法,里面有一个循环。这个循环运行了 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 个步骤(你说是 5 个)!为什么不在调试器中运行呢?
  • 您的声明 (i + maxBatchSize) &lt;= bigCollection.size() 检查 i 是否为 2、4、6、8,并在第五次运行中检查 10 和 8,然后停止。怎么了?
  • 如果您无法轻松查看循环代码并查看它运行了多少次,这意味着您的代码过于复杂,请尝试创建一些具有良好名称的中间变量以使其更易于理解。
  • 对不起,伙计们......我的错......抱歉浪费你的时间......

标签: java for-loop logic


【解决方案1】:

当您处于第 4 次迭代时,您的循环条件是这样的:

(i + maxBatchSize) <= bigCollection.size()
 6 + 2             <= 8

所以你要进去了。但是第五次迭代不再尊重这个条件,因为它是这样的:

(i + maxBatchSize) <= bigCollection.size()
 8 + 2             <= 8

不要忘记,您的病情不仅在 i 上,而且在 i + maxBatchSize

【讨论】:

    【解决方案2】:

    下面的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没有被执行)。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-02-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多