如何获得两个自定义树之间的区别?

时间:2019-10-21 13:47:23

标签: java algorithm tree difference

A具有以下描述文件存储库的类。有一个服务器充当主存储库,然后有多台客户端计算机。

function remove_menu_pages() {

    global $user_ID;

    if ( !current_user_can( 'publish_posts' ) ) {
       remove_menu_page('edit-comments.php'); // Comments
       remove_menu_page('edit.php?post_type=page'); // Pages
       remove_menu_page('wpcf7'); // Contact Form 7 Menu
    }
}
add_action( 'admin_init', 'remove_menu_pages' );

有时我需要将客户端存储库更新为最新版本。客户端将其回购的描述发送到服务器。为了执行更新,我需要知道已更新了哪些文件-获取仅包含更新条目(class Entry { String name; String filename; ZonedDateTime lastModified; } class Section { String name; String directory List<Section> sections; List<Entry> Entries; } Section localRepositoryDescription = scanFilesystem(); )的树。我已经读过各种算法来区分两棵树,但是我仍然不确定如何完成此任务。

一旦有了这个差异树,我将压缩这些修改后的文件以存档并将相应的响应发送给客户端。

1 个答案:

答案 0 :(得分:0)

假设您已经管理了 lastModified 属性,如果Entry中实现了hashCode()/ equals(Object obj)方法,则可以创建两个Set<Entry>,一个在客户端在服务器上。 然后在服务器端,您可以将两个集合与类似的代码进行比较

List<Entry> updated = getServerEntries().stream().filter(serverEntry -> {
  return getClientEntries().contains(serverEntry);
}).collect(Collectors.toList());

很显然,这段代码假设客户端需要基于服务器端Set<Entry>进行同步。通常, contains 方法将首先使用哈希搜索条目,如果找到,两个相等的hashCode,使用 equals

一个简单的hashCode可能是

  @Override
  public int hashCode() {
    final int prime = 31;
    int result = 1;
    result = prime * result + ((filename == null) ? 0 : filename.hashCode());
    result = prime * result + ((lastModified == null) ? 0 : lastModified.hashCode());
    result = prime * result + ((name == null) ? 0 : name.hashCode());
    return result;
  }

令人高兴的是,假设您的应用程序在发生时自动更新 Entry.lastModified ,您可以免费获得所有这些信息。