如何在文件系统中查找具有多个父级的重复子节点?

时间:2014-12-29 07:10:59

标签: java algorithm graph-algorithm

在定制的内存文件系统中,我的文件和目录采用树的形式,其中目录具有对子节点的引用,子节点可以是目录或文件。 我可以对文件和目录进行添加,删除,删除,移动操作。现在由于某个错误,每当文件从父节点移动到另一个父节点时,它的引用就不会从先前的父节点中删除。

示例

D1 (parent ) C1 ( child )
after move
D1 (parent ) C1 (child)
D2 (parent ) C1 (child)

问题: 现在问题是找出所有这些具有重复父母的文件的最佳方法是什么?现在我将所有文件引用保存在一个全局哈希集中,如果我有一大堆文件,那将会很痛苦?

注意::家长知道其所有孩子,但孩子不知道其父母。

到目前为止采取的方法:我想到的方法是首先遍历整个目录结构,然后将所有文件引用保留在一个哈希集中,然后在向hashset插入任何值之前,我将检查它是否已经存在,如果是,则这是一个具有重复父节点的损坏文件。

import java.io.File;
import java.util.HashSet;
import java.util.Set;

public class RecursiveFiles {
    private static Set<File> set = new HashSet<File>();

    public static void main(String[] args) {
        File root = new File("C:\\Windows\\Help");
        showFiles(root);
    }

    private static void showFiles(File root) {
        if(root.isDirectory()){
            File[] children = root.listFiles();
            for(File child : children){
                showFiles(child);
            }   
        }else {
            if(set.contains(root)){
                System.out.println("Duplicate File " + root);   
            }else {
                set.add(root);
            }
        }
    }

}

1 个答案:

答案 0 :(得分:0)

如果将文件视为节点和父节点作为边缘,那么您可以使用bfs / dfs算法但稍微改变,而不是布尔访问状态,使用每个节点访问的列表,并在列表中保留所有访问此节点的父地址。还要考虑您的图表是直接图表,因此没有人可以访问他的父母。