有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java递归到迭代

我在使用Java的windows桌面应用程序中工作。在我的应用程序中,需要搜索所有。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();
        }
    }
}

有没有可能用迭代算法来实现这一点


共 (3) 个答案

  1. # 1 楼答案

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

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

    -更新

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

     Pattern p = Pattern.compile( ".*"+source+".*" );
     boolean found = p.matcher( p.matcher( srcc.getName() ).matches() );
    

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

  2. # 2 楼答案

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

    伪代码如下:

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

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

    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;
    }