2015-10-13 191 views
-1

我一直在試圖解決一個編程問題,並且遇到了一個範圍問題。這是問題的一個SCE:嵌套for循環範圍

for (int Hole1 = 1; Hole1 < beavers; Hole1++) { 
     list = exampleList; 

     for (int t = 0; t < Hole1; t++) { 
      temp.add(list.get(0)); 
      list.remove(0); 
     } 

     for (int p = 0; p < Hole1; p++) { 
      list.add(temp.get(temp.size() - 1)); 
      temp.remove(temp.size() - 1); 
     } 
     exampleList2 = list; 

     for (int Hole2 = 1; Hole2 < beavers; Hole2++) { 
      list = exampleList2; 

      for (int t = 0; t < Hole2; t++) { 
       temp.add(list.get(0)); 
       list.remove(0); 
      } 

      for (int p = 0; p < Hole2; p++) { 
       list.add(temp.get(temp.size() - 1)); 
       temp.remove(temp.size() - 1); 
      } 
      exampleList3 = list; 

      for (int Hole3 = 1; Hole3 < beavers; Hole3++) { 
       list = exampleList3; 

       for (int t = 0; t < Hole3; t++) { 
        temp.add(list.get(0)); 
        list.remove(0); 
       } 

       for (int p = 0; p < Hole3; p++) { 
        list.add(temp.get(temp.size() - 1)); 
        temp.remove(temp.size() - 1); 
       } 

       System.out.println(list.toString() + " " + Hole1 + " " + Hole2 + " " + Hole3); 
       if (check(list)) 
        System.out.println("match"); 
      } 
     } 
    } 

我的問題是examplelist3改變了的hole3for loop每次迭代值,但是從我的理解每個loop完成它在移動之前的迭代。任何人都知道發生了什麼?

編輯*除去SCE和發佈的代碼,而不是

+0

也許你可以添加你想要實現的?看起來你正在以某種尷尬的方式做一些嵌套的迭代/分配。 – RAnders00

+0

'每個for-loop在繼續之前完成它的迭代。「這就是實際發生的事情。 –

+0

嗯,這是我無法破解的比賽中的一個問題。您從5 4 3 2 1列表開始,通過3個「洞」(深度介於1和n-1之間)運行它們。 [問題可以在第5頁看到](http://www.progolymp.se/static/arkiv/kval15.pdf)。然後在特定的位置匹配它們並獲得鑽孔深度。 – AlexVestin

回答

1

的代碼中的問題去,所有的變量 - liststartlistexamplelist2examplelist3 - 指的是同一個列表對象。這意味着如果您對這些變量中的任何一個進行了任何更改,則所有其他變量都將顯示更新的列表,因爲它們都引用同一個對象。

因此,即使代碼在第3個for循環中更新list,這些更改也將反映在exampleList3中,因爲這兩個變量都指向堆中的同一對象。

檢查this SO問題。

0

從我的理解,每個for-loop在繼續前完成它的迭代。

這是真的。

代碼中發生了什麼?的for(hole2)迭代正在做完整的,這意味着在每次迭代將執行for(hole3),因爲是for(hole2)

範圍內的for(hole2)每個迭代將永遠是這個代碼:

list = examplelist2; 
//sorting list 
examplelist3 = list; 

for(hole3){ 
    list = examplelist3; 
    //sorting list 
    //check if matching 
} 

什麼暗示迭代每次超過for(hole3)