2011-12-19 128 views
0

我正在使用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(); 
     } 
    } 
} 

是否可以用迭代算法做到这一点?

回答

1

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

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

- 更新

你可以找到的File.list超负荷使用here的文档。而对于这个模式,你可以像局部变量那样(在循环之外或者使用递归的数据成员)。

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

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

+0

可能更多解释 – 2011-12-19 17:53:17

+0

非常感谢 – 2011-12-19 18:02:02

3

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

伪代码如下:

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

谢谢,但可以使用堆栈? – 2011-12-19 17:55:10

+0

@Anouar Elmekki - 为什么堆叠?队列在这里是完美的。顺便说一下,每个递归函数都可以使用堆栈转换为迭代函数,但这太人为。 – 2011-12-19 18:03:44

+0

谢谢你可以用java编写代码 – 2011-12-19 18:15:39

1

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

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

@Petar Minchev它比堆栈运行速度快一些(〜15%)(至少链接列表实现队列)。 – 2011-12-19 18:43:26

+0

谢谢你,我的朋友 – 2011-12-19 18:52:05