java - 使用递归和通配符 (*) 在文件中搜索

标签 java recursion wildcard

我编写此代码是为了通过递归和支持多个通配符 (*) 的实现来搜索路径的文件。

我的代码在这里:

package filesearch;

import java.io.File;
import java.util.Scanner;


public class FileSearch {

    public void walk( String path, String partOfFile ) {

        File root = new File( path );
        File[] list = root.listFiles();

        if (list == null) return;

        for ( File f : list ) {
            if ( f.isDirectory() ) {
                walk( f.getAbsolutePath(), partOfFile );
            }
            else {
                if(match(f.getAbsolutePath(), partOfFile)){

                    System.out.println( "File:" + f.getAbsoluteFile() );
                }
                else{

                }
            }
        }
    }
    public boolean match(String fileName, String partOfFileName){
        if(partOfFileName.indexOf("*") == -1){
                if(fileName.equalsIgnoreCase(partOfFileName))
                    return true;
                else
                    return false;
        }
        else{
            if(partOfFileName.indexOf("*") == partOfFileName.length()-1){
                if(fileName.startsWith(partOfFileName.substring(0, partOfFileName.indexOf("*"))))
                    return true;
            }
            if(partOfFileName.indexOf("*") == 0 ){
                if(partOfFileName.indexOf("*", 1) == -1){
                    if(fileName.endsWith(partOfFileName.substring(1)))
                        return true;

                }
                else{
                    String betweenAsteriks = partOfFileName.substring(1, partOfFileName.indexOf("*", 1));
                    if(fileName.indexOf(betweenAsteriks) != -1){
                        match(fileName, partOfFileName.substring(partOfFileName.indexOf("*", 1)));
                    }
                    else{
                        return false;
                    }
                }
            }
            if(partOfFileName.indexOf("*") != 0 && partOfFileName.indexOf("*")!=partOfFileName.length()-1){
                return (match(fileName, partOfFileName.substring(partOfFileName.indexOf("*"))) && match(fileName, partOfFileName.substring(0, partOfFileName.indexOf("*")+1)));
            }
            return false;
        }
    }

    public static void main(String[] args) {
        FileSearch fw = new FileSearch();
        Scanner s = new Scanner(System.in);
        String partOfFileName = s.next();

        fw.walk("h:\\" , partOfFileName);

    }    
}

但是当我在执行中使用多个 (*) 时,它无法正常工作。请帮助我

最佳答案

请检查此代码是否满足您的需求:

public boolean match (String filename, String partOfFileName) {
    StringTokenizer st = new StringTokenizer(partOfFileName, "*");
    if (st.hasMoreTokens()) {
        String partialName = st.nextToken(); //get the first substring contained before an *
        int index = filename.indexOf(partialName); //check if it is contained in your filename
        if (index != -1) {
            filename = filename.substring(index + partialName.length()); //if it's contained, cut the filename to check the rest of the string
            partOfFileName = partOfFileName.substring(partOfFileName.indexOf(partialName) + partialName.length()); //cut the partOfFileName so you can get the next token
            return match(filename, partOfFileName); //recursive call
        } else {
            return false;
        }
    }
    return true;
}

我认为你不应该询问 * 的每个可能位置(结束、开始、中间),你只需要知道每个 * 之前的子字符串是否包含,无论它在哪里。 我用StringTokenizer获取 * 之间包含的子字符串(它将字符串分解为标记,使用接收到的字符作为参数,在我们的例子中为 *)。基本上我创建了 StringTokenizer,获取每个 * 之前的子字符串并检查它是否包含在完整字符串中:如果是这样,那么我剪切两个字符串(文件名和partOfFileName)并进行递归调用,如果不包含则返回 false。
让我知道是否可以。问候

关于java - 使用递归和通配符 (*) 在文件中搜索,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20295096/

相关文章:

c - 使用 * 作为通配符在 C 中匹配字符串

java - 父类(super class)类型的对象无法访问子类的方法

java - 取消 CountDownTimer Android Java

java - 获取所有枚举常量

javascript - 如何使这个数组展平函数在 JavaScript 中递归运行?

php - 嵌套的 UL LI 到 PHP 数组 - 数组中的输出不正确

java - 使用 Criteria 根据时间段从数据库获取对象?

java - Java中的Add-Recursion,为什么最大值这么低?

linux - bash 中的星号通配符

makefile - Makefile 中的通配符($(1) 是什么意思?)