嵌套的for循环范围

时间:2015-10-13 10:31:07

标签: java

我一直在努力解决编程问题,并遇到了一个范围问题。这是问题的SCE:

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 会为 hole3 for loop的每次迭代更改值,但根据我的理解,每个loop都会完成它&#39 ; s继续前的迭代。任何人都知道发生了什么?

EDIT *删除了SCE并发布了代码

2 个答案:

答案 0 :(得分:1)

根据问题中的代码,所有变量 - liststartlistexamplelist2examplelist3 - 都引用相同的列表对象。这意味着如果对这些变量中的任何变量进行任何更改,则所有其他变量将显示更新的列表,因为它们都引用相同的对象。

因此,即使代码在第3 list循环中更新for,更改也将反映在exampleList3中,因为两个变量都指向堆中的同一对象。

检查this SO问题。

答案 1 :(得分:0)

  

从我的理解中,每个for循环在继续之前完成它的迭代。

这是真的。

您的代码中发生了什么? 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)意味着什么。