Как получить разницу между двумя пользовательскими деревьями? - PullRequest
0 голосов
/ 21 октября 2019

A имеет следующие классы, которые описывают хранилище файлов. Есть сервер, который действует как главный репозиторий, а затем есть несколько клиентских компьютеров.

class Entry
{
    String name;
    String filename;
    ZonedDateTime lastModified;
}

class Section
{
    String name;
    String directory
    List<Section> sections;
    List<Entry> Entries;
}

Section localRepositoryDescription = scanFilesystem();

Иногда мне нужно обновить клиентские репозитории до последней версии. Клиент отправляет описание своего репо на сервер. Чтобы выполнить обновление, мне нужно знать, какие файлы были обновлены - получить дерево, которое будет содержать только обновленные записи (entryOnServer.lastModified > localEntry.lastModified). Я читал о различных алгоритмах, чтобы получить разницу между двумя деревьями, но я все еще не уверен, как подойти к этой задаче.

Как только я получу это дерево различий, я бы сжал эти измененные файлы доархивировать и отправлять соответствующие ответы клиентам.

1 Ответ

0 голосов
/ 21 октября 2019

Предполагая, что вы уже управляете свойством lastModified , если в вашей записи реализован метод hashCode () / equals (Object obj), вы можете создать два Set<Entry>, один на клиентском, один на сервере,Затем на стороне сервера вы можете сравнить две коллекции с кодом, подобным

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

. Очевидно, этот код предполагает, что клиент должен быть синхронизирован на основе стороны сервера Set<Entry>, в общем случае Метод "" будет сначала искать запись с использованием хэша, затем, если он найдет два одинаковых хэш-кода, использует равно .

Простой хэш-код может быть

  @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 при возникновении.

...