Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/loops/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 迭代递归_Java_Recursion_Io_Iteration - Fatal编程技术网

Java 迭代递归

Java 迭代递归,java,recursion,io,iteration,Java,Recursion,Io,Iteration,我在使用Java的windows桌面应用程序中工作。在我的应用程序中,需要搜索all.php。为此,我使用递归方法 import java.io.File; public class Copier { public static void find(String source,String rep) { File src = new File(rep); if (src!= null && src.exists() &&

我在使用Java的windows桌面应用程序中工作。在我的应用程序中,需要搜索all.php。为此,我使用递归方法

import java.io.File;

public class Copier {

    public static void find(String source,String rep) {
        File src = new File(rep);
        if (src!= null && src.exists() && src.isDirectory()) {
            String[] tab = src.list();
            if (tab != null) {
                for(String s : tab) {
                    File srcc = new File(rep+"\\"+s);
                    if (srcc.isFile()) {  
                        if (srcc.getName().matches(".*"+source+"$")) {
                            System.out.println(s);
                        }
                    } else {
                        find(source,srcc.getAbsolutePath());
                    }
                }
            } else {
                //System.out.println(" list is null");
            }
        }
    }

    public static void main(String[] args) {
        try {
            find(".java", "C:\\");
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}
可以用迭代算法来实现吗?

当然可以。与队列一起使用。从
C:\
开始,每一步都从队列中弹出顶部文件夹,并将所有子文件夹推到队列的末尾

伪代码如下:

queue.push("C:\");
while (!queue.empty()) { 
   String topFolder = queue.pop();
   foreach (subFolder of topFolder) {
        queue.push(subFolder);
   }
}
当然。与队列一起使用。从
C:\
开始,每一步都从队列中弹出顶部文件夹,并将所有子文件夹推到队列的末尾

伪代码如下:

queue.push("C:\");
while (!queue.empty()) { 
   String topFolder = queue.pop();
   foreach (subFolder of topFolder) {
        queue.push(subFolder);
   }
}

我不明白为什么你想摆脱递归,虽然理论上你所寻找的是可能的

但是获得更快程序的一个好方法是在列出目录的子目录时使用文件过滤器。一个用于目录,一个用于匹配文件(这个应该使用java.util.regexp.Pattern)

-更新

您可以找到要使用的
文件列表的重载文档。对于模式,可以使用局部变量(在循环外部或使用递归的数据成员外部)


哦,顺便说一下,不要把srcc转换成文件!使用字符串并构建尽可能少的对象。

我不明白为什么要放弃递归,尽管理论上你正在寻找的是可能的

但是获得更快程序的一个好方法是在列出目录的子目录时使用文件过滤器。一个用于目录,一个用于匹配文件(这个应该使用java.util.regexp.Pattern)

-更新

您可以找到要使用的
文件列表的重载文档。对于模式,可以使用局部变量(在循环外部或使用递归的数据成员外部)


哦,顺便说一下,不要把srcc转换成文件!使用字符串并构建尽可能少的对象。

您始终可以使用队列代替递归。在这种情况下,我认为它使代码看起来更容易阅读。通常,迭代实现比递归实现的性能更好,不过在这种情况下,它们的运行速度几乎相同(至少在我的机器上是如此)

公共静态列表查找(最终字符串源,最终字符串目录)
{
列表结果=新建LinkedList();
堆栈=新堆栈();
添加(目录);
字符串代表;
而(!stack.isEmpty()){
rep=stack.pop();
文件src=新文件(rep);
如果(src!=null&&src.exists()&&src.isDirectory()){
String[]tab=src.list();
如果(制表符!=null){
用于(字符串s:选项卡){
文件srcc=新文件(rep+File.separatorChar+s);
if(srcc.isFile()){
if(srcc.getName().matches(“.*”+source+“$”)匹配){
//系统输出打印项次;
结果:添加(s);
}
}否则{
add(srcc.getAbsolutePath());
}
}
}否则{
//System.out.println(“列表为空”);
}
}
}
返回结果;
}

您始终可以使用队列代替递归。在这种情况下,我认为它使代码看起来更容易阅读。通常,迭代实现比递归实现的性能更好,不过在这种情况下,它们的运行速度几乎相同(至少在我的机器上是如此)

公共静态列表查找(最终字符串源,最终字符串目录)
{
列表结果=新建LinkedList();
堆栈=新堆栈();
添加(目录);
字符串代表;
而(!stack.isEmpty()){
rep=stack.pop();
文件src=新文件(rep);
如果(src!=null&&src.exists()&&src.isDirectory()){
String[]tab=src.list();
如果(制表符!=null){
用于(字符串s:选项卡){
文件srcc=新文件(rep+File.separatorChar+s);
if(srcc.isFile()){
if(srcc.getName().matches(“.*”+source+“$”)匹配){
//系统输出打印项次;
结果:添加(s);
}
}否则{
add(srcc.getAbsolutePath());
}
}
}否则{
//System.out.println(“列表为空”);
}
}
}
返回结果;
}

@Anouar Elmekki-为什么要堆叠?这里排队很好。顺便说一下,每个递归函数都可以使用堆栈转换为迭代函数,但它太人工了。@Anouar Elmekki-为什么是堆栈?这里排队很好。顺便说一句,每个递归函数都可以使用堆栈转换为迭代函数,但它太人工了。@Petar Minchev使用堆栈比使用队列(至少是队列的链表实现)运行得快一些(~15%)。@Petar Minchev使用堆栈比使用队列运行得快一些(~15%)(至少是队列的链表实现)。
public static List<String> find(final String source, final String directory)
{
    List<String> results = new LinkedList<String>();
    Stack<String> stack = new Stack<String>();

    stack.add(directory);

    String rep;
    while (!stack.isEmpty()) {
        rep = stack.pop();
        File src = new File(rep);
        if (src != null && src.exists() && src.isDirectory()) {
            String[] tab = src.list();
            if (tab != null) {
                for (String s : tab) {
                    File srcc = new File(rep + File.separatorChar + s);
                    if (srcc.isFile()) {
                        if (srcc.getName().matches(".*" + source + "$")) {
                            // System.out.println(s);
                            results.add(s);
                        }
                    } else {
                        stack.add(srcc.getAbsolutePath());
                    }
                }
            } else {
                // System.out.println(" list is null");
            }
        }
    }
    return results;
}