繁体   English   中英

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

[英]What is an efficient way to compare JTrees?

我经常将数据备份到外部驱动器,并且必须浏览已拥有和尚未转移的文件。 我认为创建一个工具将非常有用,该工具将允许我选择两个目录,进行比较,然后单击几下按钮即可将文件传输过来。

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

因此,首先,我有一个方法将获取所有文件夹和文件,以便填充我的树:

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,我将如何比较节点以查看外部文件不存在什么文件? 比较文件数组会更容易吗?

编辑

所谓高效,是指如果文件树包含成千上万个文件,则最不可能使计算机瘫痪。

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

因此,您应该做的是拿出一个数据结构来比较数据,然后使用JTree显示比较结果。 假设您要保留CPU资源,那么我想说您想使用TreeMap

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

最好的是,由于TreeMap确保containsKey (), getputremove方法的log(n),因此将花费nLog(n)插入源中的所有文件,而花费nLog(n)删除(基本上是比较)目标中的所有键。

编辑

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM