java递归中的返回问题

I_am_a_java_CaiNiao 2009-12-31 11:03:01
大家好,小弟欲使用递归对某目录进行搜索,找到需要的文件,如果递归函没有返回值,只是打印出一些信息,那是没问题的,但是如果作为函数返回值进行返回,则出现问题,如下代码:

// dir表示目录路径,name表示欲匹配的文件名的正则表达式
private File getFile(String dir, String name) {
File[] files = new File(dir).listFiles();
int len = files.length;
for (int i = len-1; i >= 0; i--) {
if (files[i].isDirectory()) {
// 当前访问文件为目录,则递归
return getFileStrByRegex(files[i].getAbsolutePath(), regName);
} else if (files[i].getName().matches(regName)) {
// 找到,返回
return files[i];
} else {
// 当前访问文件为真实文件,而非目录,但又不是符合条件的
// 这里要怎么写?当然可以什么都不写,那就请看最后一句return null;的注释
}
}
// 这句话一执行,无论当前递归到哪一层,整个函数都会结束并返回null,但是如果这句没有,则由于函数有返回值,会报语法错误
return null;
}

问:如何以递归的方式返回文件(注意需要返回值)?还有,我测试了一下,发现return和return null是不一样的,前者只会返回当前层的递归,而后者则所有层都返回,即整个递归过程结束。请指教,谢谢,谢谢~~
...全文
1675 10 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
wen691 2011-05-10
  • 打赏
  • 举报
回复
用全局变量的话,会有线程安全问题哦
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 dan1980 的回复:]
else if (files[i].getName().matches(regName)) {
                // 找到,返回
                return files[i];
很简单,你在找到第一个文件的时候就不再调用递归方法了,递归就终止了呀!
[/Quote]

对,这是毫无疑问的,可是我没找到文件时就返回了,因为执行了return null
苍蝇①号 2009-12-31
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 pjw100 的回复:]
递归目录不需要返回值。
我这是C#的递归目录,跟Java应该差不多。在外面声明一个ArrayList来接
C# codepublic ArrayList al=new ArrayList();//我把ArrayList当成动态数组用,非常好用publicvoid GetAllDirList(string strBaseDir)
{
  DirectoryInfo di=new DirectoryInfo(strBaseDir);
  DirectoryInfo[] diA=di.GetDirectories();for(int i=0;i<diA.Length;i++)

  {
   al.Add(diA[i].FullName);//diA[i].FullName是某个子目录的绝对地址,把它记录在ArrayList中   GetAllDirList(diA[i].FullName);//注意:递归了。逻辑思维正常的人应该能反应过来  }
}
[/Quote]
像这哥们说的要个容器存起来,因为递归回返的样性,没法给你返回唯一值
Dan1980 2009-12-31
  • 打赏
  • 举报
回复
else if (files[i].getName().matches(regName)) {
// 找到,返回
return files[i];
很简单,你在找到第一个文件的时候就不再调用递归方法了,递归就终止了呀!
zhaining522 2009-12-31
  • 打赏
  • 举报
回复

// dir表示目录路径,name表示欲匹配的文件名的正则表达式
private File getFile(String dir, String name) {
File[] files = new File(dir).listFiles();
File file= null;
int len = files.length;
for (int i = len-1; i >= 0; i--) {
if (files[i].isDirectory()) {
// 当前访问文件为目录,则递归
System.out.println("目录为 :" + files[i].getAbsolutePath());
getFile(files[i].getAbsolutePath(),name);
} else if (files[i].getName().matches(name)) {
// 找到,返回
file = files[i];
break;
} else {
System.out.println("不符合文件 :" + files[i].getName());
// 当前访问文件为真实文件,而非目录,但又不是符合条件的
// 这里要怎么写?当然可以什么都不写,那就请看最后一句return null;的注释
}
}
// 这句话一执行,无论当前递归到哪一层,整个函数都会结束并返回null,但是如果这句没有,则由于函数有返回值,会报语法错误
return file;
}


你要的可能是这个效果吧
递归是函数自身调用自身。。。。。
  • 打赏
  • 举报
回复
多谢各位~
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 pjw100 的回复:]
递归目录不需要返回值。
我这是C#的递归目录,跟Java应该差不多。在外面声明一个ArrayList来接
C# codepublic ArrayList al=new ArrayList();//我把ArrayList当成动态数组用,非常好用publicvoid GetAllDirList(string strBaseDir)
{
  DirectoryInfo di=new DirectoryInfo(strBaseDir);
  DirectoryInfo[] diA=di.GetDirectories();
 for(int i=0;i<diA.Length;i++)

  {
   al.Add(diA[i].FullName);
  //diA[i].FullName是某个子目录的绝对地址,把它记录在ArrayList中   GetAllDirList(diA[i].FullName);
  //注意:递归了。逻辑思维正常的人应该能反应过来  }
}
[/Quote]
这个方法倒确实可行,我之前也试过,非常感谢。
swandragon 2009-12-31
  • 打赏
  • 举报
回复
定义一个全局变量,存储搜索结果就可以了

List<File> list = new ArrayList<File>();
pjw100 2009-12-31
  • 打赏
  • 举报
回复
递归目录不需要返回值。
我这是C#的递归目录,跟Java应该差不多。在外面声明一个ArrayList来接

public ArrayList al=new ArrayList();
//我把ArrayList当成动态数组用,非常好用
public void GetAllDirList(string strBaseDir)
{
  DirectoryInfo di=new DirectoryInfo(strBaseDir);
  DirectoryInfo[] diA=di.GetDirectories();
  for(int i=0;i<diA.Length;i++)

  {
   al.Add(diA[i].FullName);
  //diA[i].FullName是某个子目录的绝对地址,把它记录在ArrayList中
   GetAllDirList(diA[i].FullName);
  //注意:递归了。逻辑思维正常的人应该能反应过来
  }
}
huosidun0302 2009-12-31
  • 打赏
  • 举报
回复
up

62,634

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧