2015-10-13 193 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)