2015-08-17 124 views
0

我有这个拆分方法,我有一个循环。此循环运行4次,但应运行5次。任何想法为什么它的行为如此?Java循环奇怪的行为

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

伙计,只有4步(根据你的5)!你为什么不在调试器中运行它? – dotvav

+2

你的语句'(i + maxBatchSize)<= bigCollection.size()'检查我是否为2,4,6,8,并在第五次运行中再次运行10次,然后停止。怎么了 ? – MrT

+0

如果您无法轻松查看循环代码并查看它运行多少次,则意味着代码太复杂,请尝试使用良好的名称创建一些中间变量,以便更容易理解。 – codebox

回答

4

当你在迭代4,你的循环condititoin是这样的:

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

所以你要在但第五次迭代已经不尊重这个条件,因为它是这样的:

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

不要忘记,你的病情不仅ii + maxBatchSize

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通过2.在总的步骤进行到6,使4个步骤:0,2,4和6

如果

以下
if (bigCollection.size() % maxBatchSize > 0) 

不执行,因为8 % 2 = 0(所以不执行subList)。