Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/search/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_Search_Hashmap - Fatal编程技术网

Java 使用哈希搜索文件树是否更有效?

Java 使用哈希搜索文件树是否更有效?,java,search,hashmap,Java,Search,Hashmap,因此,我试图优化一些我正在使用的代码。该代码是为网站生成器编写的某种通用搜索实用程序 当前,搜索在给定的基本目录中递归搜索字符串,并返回具有该名称的任何目录的最后一个实例,或找到的任何非目录的第一个实例 例: 任何关于使我的代码更优化的支持或信息,或者我没有想到的问题,都会非常好 我最终只是实现了它,速度快了大约400% 编辑: 一些改进总体代码的优化 注意:这段代码不是线程安全的,因为我使用的是静态方法和变量 您是否尝试过在Java中使用FileVisitor接口?你不必为此重新发明轮子。你试

因此,我试图优化一些我正在使用的代码。该代码是为网站生成器编写的某种通用搜索实用程序

当前,搜索在给定的基本目录中递归搜索字符串,并返回具有该名称的任何目录的最后一个实例,或找到的任何非目录的第一个实例

例:


任何关于使我的代码更优化的支持或信息,或者我没有想到的问题,都会非常好

我最终只是实现了它,速度快了大约400%

编辑: 一些改进总体代码的优化


注意:这段代码不是线程安全的,因为我使用的是静态方法和变量

您是否尝试过在Java中使用
FileVisitor
接口?你不必为此重新发明轮子。你试过这个工具吗?它已经被彻底调整过了<代码>查找-键入d-name foo应该会生成所有名为
foo
@MikeSamuel的目录,但是,为什么他需要
find
unix/linux的java实用程序呢。。我认为没有任何联系。你是在建议他参考
find
命令的代码吗?@shekharsuman,不是。我是说,使用经过测试和优化的实用程序来解决他的特定问题比编写、优化和调试Java程序更容易。@MikeSamuel实际上他已经提到,他将所有这些都作为项目的一部分来做!我读错了吗?可能没有!不管怎样,别感觉到,那只是一个戳。。。
public static File findFile(File baseDir, String name) throws IOException{

    File match = null;
    for (File f : findFiles(baseDir, name)){
        if (match == null || 
                match.isDirectory() || 
                matchesFile(name, f) > matchesFile(name, match)){
            match = f;
        }
    }
    return match;
}

public static Set<File> findFiles(File baseDir, String name) throws IOException{

    Set<File> files = new HashSet<File>();

    for (File f : baseDir.listFiles()){

        if (!f.isDirectory()){
            if (matchesFile(name, f) > 0){
                files.add(f);
            }
        }else{              
            files.addAll(findFiles(f, name));

            if (matchesFile(name, f) > 0){
                files.add(f);
            }
        }
    }

    if (matchesFile(name, baseDir) > 0){
        files.add(baseDir);
    }

    return files;
}
public static File findFile(File baseDir, String name) throws IOException{

    File match = null;
    if(!baseDirHash.containsKey(baseDir.getAbsolutePath())){
        baseDirHash.put(baseDir.getAbsolutePath(), baseDir);
        hashBaseDir(baseDir, baseDir);
    }

    match = baseDirHash.get(baseDir.getAbsoluteFile() + name);

    if(match == null || !match.exists()){
        for (File f : findFiles(baseDir, name)){
            if (match == null || 
                    match.isDirectory() || 
                    matchesFile(name, f) > matchesFile(name, match)){
                match = f;
            }
        }
    }

    if(!match.isDirectory()){
        baseDirHash.put(baseDir.getAbsoluteFile() + name, match);

    }

    return match;
}
...
private static void hashBaseDir(File baseDir, File currentDir) throws IOException{

    for (File f : currentDir.listFiles()){

        if (!f.isDirectory()){

            baseDirHash.put(baseDir.getAbsolutePath() + f.getName(), f);

        }else{

            hashBaseDir(baseDir, f);

        }
    }
}