使用hashTable查找目录中的文本文件是否有效?

时间:2017-03-05 19:44:34

标签: java hashtable

就空间和运行时而言,使用哈希表来搜索目录中的特定文件是否有效?我想创建索引一次,当你想要时,能够在需要时重新索引,但能够相对快速地搜索。

我将hashCode存储为键,将文件名存储为值。

private Map<Integer,String> indexDirectoryByHash()
{
    Map<Integer,String> hashTable = new Hashtable<Integer, String>();
    File directory = new File(this.path);
    File[] directoryFiles = directory.listFiles();


    String filename;
    int hashCode;



    for (int i = 0; i < directoryFiles.length; i++)
    {
        filename = directoryFiles[i].getName();
        hashCode = filename.hashCode();
        hashTable.put(hashCode,filename);
    }

    return hashTable;
}





public boolean searchFile(String filename)
{

    if (hash.get(filename.hashCode()) != null)
        return true;
    else
        return false;
}

好吧改为使用集合代替哈希表。

private Set<String> indexDirectoryByHashSet()
{
    Set<String> files = new HashSet<String>();
    File directory = new File(this.path);
    File[] directoryFiles = directory.listFiles();

    String filename;

    for (int i = 0; i < directoryFiles.length; i++)
    {
        filename = directoryFiles[i].getName();
        files.add(filename);
    }

    return files;
}

public boolean searchFile(String filename)
{
    return fileSet.contains(filename);
}

2 个答案:

答案 0 :(得分:4)

您的代码速度很快,但不正确:因为它存储了散列,并且因为散列不是唯一的,所以您的搜索方法存在返回误报的风险。

您无法通过添加检查来解决此问题,即由于哈希冲突,地图返回的内容与搜索名称匹配。

更好的方法是存储字符串而不是哈希码。为此使用字符串的HashSet,并通过调用contains(name)方法进行检查。

答案 1 :(得分:0)

我没有理由不这样做,也没有真正过度思考它,只是编写今天有效的代码,如果事实证明效率低下则寻找替代方案。