什么是比较JTrees的有效方法?

时间:2012-12-19 18:55:32

标签: java swing compare jtree

我经常将数据备份到外部驱动器,并且必须筛选我拥有的文件并且尚未转移。我认为创建一个允许我选择两个目录,比较它们,然后只需点击几下按钮就可以传输文件的工具会很有用。

我确信这类项目已经存在,所以对我来说,主要是学习经验。

所以为了启动它,我有一个方法可以获取我的所有文件夹和文件,以便我可以填充我的树:

public static void listAllFiles(String directory, DefaultMutableTreeNode parent, Boolean recursive) {
    File [] children = new File(directory).listFiles(); 

    for (int i = 0; i < children.length; i++) { 
        DefaultMutableTreeNode node = new DefaultMutableTreeNode(children[i].getName());    

        if (children[i].isDirectory() && recursive) { 
            parent.add(node); 
            listAllFiles(children[i].getPath(), node, recursive);    
        } else if (!children[i].isDirectory()){ 
            parent.add(node); 
        }
    }
}

调用该方法后,我只需创建我的JTree并将其添加到我的视图中:

myTree = new JTree(parent);
jScrollPane1.setViewportView(myTree);

所以,一旦我有了两个JTree,我将如何比较节点以查看外部不存在哪些文件?比较文件数组会更容易吗?

修改

通过高效,我的意思是,如果文件树包含数千个文件,则最不可能使计算机陷入困境。

1 个答案:

答案 0 :(得分:4)

我认为答案是:为什么要比较JTree? JTree是用于显示数据的GUI元素 - 而不是用于存储/比较/操作数据的数据结构。

因此,您应该做的是提供一个数据结构来比较您的数据,然后使用JTree显示您的比较结果。假设CPU资源是你想要保存的,我想你要使用TreeMap

基本上,您将在源文件系统上构建TreeMap,然后在目标文件系统上找到(并匹配)它们时从TreeMap中删除项目。完成比较后,您可以在JTree中显示仍需要同步的文件。

最重要的是,由于TreeMap保证了containsKeygetputremove方法的log(n),它将花费你nLog(n)插入源中的所有文件,并使用nLog(n)删除(基本上是比较)目标中的所有键。

修改

哦,WinMerge是我用过文件系统比较的最佳工具之一。当然,我从未用它来同步备份驱动器......