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

Java 比较JTree的有效方法是什么?,java,swing,compare,jtree,Java,Swing,Compare,Jtree,我经常将我的数据备份到外部驱动器,并且必须筛选我已经传输和尚未传输的文件。我认为创建一个工具会很有用,它可以让我选择两个目录,比较它们,然后点击几下按钮就可以传输文件 我确信这类项目已经存在,所以对我来说,这主要是一种学习经验 因此,首先,我有一个方法可以获取我的所有文件夹和文件,以便填充我的树: public static void listAllFiles(String directory, DefaultMutableTreeNode parent, Boolean recursive)

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

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

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

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,我将如何比较节点,以查看哪些文件不存在于我的外部服务器上?比较文件数组会更容易吗

编辑


所谓高效,我的意思是,在文件树由数千个文件组成的情况下,最不可能使计算机陷入困境。

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

因此,您应该创建一个数据结构来比较数据,然后使用JTree显示比较结果。假设CPU资源是您想要节约的资源,我想说您想要使用一个

基本上,您需要在源文件系统上构建树状图,然后在目标文件系统上查找并匹配项目时从树状图中删除项目。完成比较后,可以在JTree中显示仍需要同步的文件

最重要的是,由于TreeMap为containsKey、get、put和remove方法提供了logn保证,因此在源代码中插入所有文件需要花费nLogn,而在目标代码中删除所有键需要花费nLogn

编辑


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

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

因此,您应该创建一个数据结构来比较数据,然后使用JTree显示比较结果。假设CPU资源是您想要节约的资源,我想说您想要使用一个

基本上,您需要在源文件系统上构建树状图,然后在目标文件系统上查找并匹配项目时从树状图中删除项目。完成比较后,可以在JTree中显示仍需要同步的文件

最重要的是,由于TreeMap为containsKey、get、put和remove方法提供了logn保证,因此在源代码中插入所有文件需要花费nLogn,而在目标代码中删除所有键需要花费nLogn

编辑


哦,这是我用来比较文件系统的最好的工具之一。当然,我从来没有用它来同步备份驱动器…

你应该比较TreeModel背后的数据,它最终驱动着JTree。顺便说一句,如果你厌倦了学习体验,你要找的工具是rsync。Steve,谢谢你的建议。Vanza,谢谢你发布了一个工具来完成我正在做的事情。我可能会尽我所能查找并模拟它:你应该比较TreeModel背后的数据,它最终驱动着JTree。顺便说一句,如果你厌倦了学习体验,你正在寻找的工具叫做rsync。Steve,谢谢你的建议。Vanza,谢谢你发布了一个工具来完成我正在做的事情。我可能会尽我所能查找并模拟它:事实上,我应该意识到我不一定要比较JTree,而是要比较其中的数据。你提到要使用树形图,但我到底要在地图上放什么?我会将键设为父项、子项等,将值设为文件路径的数组吗?@WilliamShatner TreeMap的名称有点误导-从用户的角度来看,它的工作原理与HashMap非常相似,只是在后台的操作不同而已。不用花太多心思,我会说,把你可能会剪切的完整匹配文件路径C:/放入,比如键和实际的文件对象作为值。这样就很容易比较哪些文件存在,哪些文件不存在。另外,你还有对仍然需要同步的文件的引用,这样你就不必再次找到它们。假设文件结构完全相同,我就不需要测试文件是否存在,对吗?@WilliamShatner-是的,您可能不需要这样做,因为您首先找到了它,尽管您可能仍然希望测试上次修改的日期。。。。因为您可以访问树映射中的文件,所以无论如何,这样做应该非常简单。事实上,我应该意识到我不一定要比较JTree,而是要比较其中的数据。你提到要使用树形图,但我到底要在地图上放什么?我会把钥匙削掉吗
nt、children等,这些值将是文件路径的数组?@WilliamShatner TreeMap的名称有点误导-从用户的角度来看,它的工作原理与HashMap非常相似,只是在后台的操作不同。不用花太多心思,我会说,把你可能会剪切的完整匹配文件路径C:/放入,比如键和实际的文件对象作为值。这样就很容易比较哪些文件存在,哪些文件不存在。另外,你还有对仍然需要同步的文件的引用,这样你就不必再次找到它们。假设文件结构完全相同,我就不需要测试文件是否存在,对吗?@WilliamShatner-是的,您可能不需要这样做,因为您首先找到了它,尽管您可能仍然希望测试上次修改的日期。。。。因为您可以访问树映射中的文件,所以无论如何,这样做应该非常简单。
myTree = new JTree(parent);
jScrollPane1.setViewportView(myTree);