Java 递归方法是否允许创建多个同名变量?
我必须想出一种方法,递归地遍历一个目录,列出其中的所有文件和子目录文件。我很确定我已经想出了一个可靠的方法来实现这一点,但是我需要一个文件数组来临时保存当前目录中的文件和目录列表。 我的问题是,一旦程序再次调用自身,该临时数组是否会被重写到现在打开的目录中的文件和目录列表中,或者是否创建了某种新数组 代码还没有完成,我只是把它包括进来,让大家知道我在用什么。当再次调用临时数组时,如果存在子目录,当程序最终返回到第一次调用时,该程序是否仍然拥有临时数组? 如果没有,我可以做些什么来解决这个问题?我曾想过创建一个列表,但在类型转换方面一直遇到麻烦Java 递归方法是否允许创建多个同名变量?,java,file,recursion,directory,Java,File,Recursion,Directory,我必须想出一种方法,递归地遍历一个目录,列出其中的所有文件和子目录文件。我很确定我已经想出了一个可靠的方法来实现这一点,但是我需要一个文件数组来临时保存当前目录中的文件和目录列表。 我的问题是,一旦程序再次调用自身,该临时数组是否会被重写到现在打开的目录中的文件和目录列表中,或者是否创建了某种新数组 代码还没有完成,我只是把它包括进来,让大家知道我在用什么。当再次调用临时数组时,如果存在子目录,当程序最终返回到第一次调用时,该程序是否仍然拥有临时数组? 如果没有,我可以做些什么来解决这个问题?我
private void enumerateDirectory(File f)
{
if(f.isDirectory()){
File[] temp = f.listFiles();
for(int i = 0; i<temp.length; ++i){
if(temp[i].isDirectory()){
enumerateDirectory(temp[i]);
}
else{
items[i].add(temp[i]);
}
}
}
else{
//error message to go here
}
}
私有目录(文件f)
{
if(f.isDirectory()){
File[]temp=f.listFiles();
对于(int i=0;i,每次方法递归时,就好像它是一个全新的方法调用--您不必担心变量名冲突,因为您只能访问当前方法执行中的变量。例如
public void a() {
int v = 1;
b();
}
public void b() {
// can't access v;
}
方法b()
无法访问变量v
。对于您来说情况相同,除了a()
调用b()
之外,它是enumerateDirectory()
调用自身
此外,编译程序时会丢弃局部变量名,并在堆栈上用偏移量替换它们。在这种情况下,它是指向数组的指针,因此在每个帧中只是一个小指针引用
编辑:
但是,items
中的元素将被重写,因为它不是局部变量。我不确定这是否是您想要的。每次方法对items
起作用时,内容都保持不变,因为它是类中的一个字段(我猜,因为我在代码中没有看到它)。这意味着如果a()
用null
s填充它,然后当b()
到达那里时,那里仍然会有null
s。当进行递归调用时,该方法会克隆自身,生成以下内容的新副本:
代码、局部变量(及其初始值)和参数
对于第一次调用,您将所有文件保存在一个数组temp中(如果f是目录):
然后在temp中迭代文件,并为每个文件再次递归调用传递文件名的方法。现在我们有了一个新的方法副本,其中传递的文件将是该方法的参数f
。当该方法副本结束时,控件将在循环后返回到下一个语句
如果存在子目录,则再次调用临时数组时
当程序最终返回时,它仍然拥有临时数组
第一个电话?
是的
文件数组不会被覆盖,因为它将被下推到堆栈中。我会使用items
数组的列表进行覆盖,因为它是可扩展的,并且避免了可能出现的ArrayIndexOutOfBound
。谢谢,是的,我在发布后不久就意识到了这一点。可能只是要添加一个计数器f类范围中的某种类型,每次添加项时都会增加,而不是将其绑定到i
File[] temp = f.listFiles();