2015-08-17 164 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)。