【问题标题】:What is an efficient way to compare JTrees?什么是比较 JTree 的有效方法?
【发布时间】:2012-12-19 18:55:32
【问题描述】:

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

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

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

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

编辑

高效,我的意思是在文件树包含数千个文件的情况下,最不可能让计算机陷入困境。

【问题讨论】:

  • 您应该比较TreeModel 背后的数据,这最终驱动了JTree
  • 顺便说一句,如果您厌倦了学习体验,您正在寻找的工具称为rsync
  • 史蒂夫,感谢您的建议。 Vanza,感谢您发布一个可以完成我正在做的事情的工具。我可能会查找它并尽我所能模仿它:)

标签: java swing compare jtree


【解决方案1】:

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

所以你应该做的是想出一个数据结构来比较你的数据,然后使用 JTree 来显示你的比较结果。假设 CPU 资源是您想要节省的资源,我会说您想要使用 TreeMap

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

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

编辑

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

【讨论】:

  • 确实,我应该意识到我不一定要比较 JTree,而是要比较其中的数据。你提到要使用 TreeMap,但我究竟会在地图中放什么?我是否可以将键设为parentchildren 等,而值将是文件路径的数组?
  • @WilliamShatner TreeMap 的名称有点误导 - 从用户的角度来看,它的工作方式与 HashMap 非常相似(只是在后台运行方式不同)。无需过多考虑,我会说将完整匹配的文件路径(您可能会删除 C:/ 等)作为键,将实际的 File 对象作为值。这样就很容易比较哪些文件存在,哪些不存在。此外,您还有对仍需要同步的文件的引用(因此您不必再次找到它们)。
  • 假设文件结构完全相同,我不需要测试文件是否存在,对吗?
  • @WilliamShatner - 是的,您可能不需要这样做,因为您首先找到了它(尽管您可能仍想测试最后修改的日期......)。因为您可以访问 TreeMap 中的文件,所以无论如何都应该非常简单。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-05-12
  • 1970-01-01
  • 1970-01-01
  • 2021-04-02
  • 2010-09-06
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多