使用散列搜索文件树是否更有效?

时间:2014-08-21 17:50:13

标签: java search hashmap

所以我正在尝试优化我正在使用的一些代码。代码是一个为网站生成器编写的有点通用的搜索实用程序。

目前,搜索通过给定的基本目录搜索字符串,并返回具有该名称的任何目录的最后一个实例,或者它找到的任何非目录的第一个实例。

前:

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

        }
    }
}

任何有关使我的代码更优化的支持或信息,或者我没有想到的问题都会很棒。

1 个答案:

答案 0 :(得分:0)

我最终只是实现了它,它的速度提高了大约400%。

编辑: 一些优化可以改善所有代码。

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