Поиск родительского объекта в Java-классе, который ссылается на себя - PullRequest
2 голосов
/ 14 марта 2012

Я создал класс, имитирующий структуру файла для программы (текстовой игры), над которой я работаю.Это упрощенная версия:

public class Dir {
  public Dir(String name, Dir[] subdirs) {
    this.name = name;
    this.subdirs = subdirs;
  }
  public String name;         //directory name
  public Dir[] subdirs;       //Sub-directories
}

Структура будет создана с использованием чего-то подобного (только намного, намного больше):

private Dir root = new Dir("root",new Dir[]{
  new Dir("first",new Dir[]{
    new Dir("child1",null),
    new Dir("child2",null),
    new Dir("child3",new Dir[]{
      new Dir("child3-1",null)
    })
  }),
  new Dir("second",null),
});

И, наконец, текущий каталог отслеживается впеременная currentDir и будет произвольно меняться в зависимости от ввода пользователя:

Dir currentDir = root.subdir[0].subdir[3].subdir[0];

Я хочу иметь возможность найти родительский объект данного объекта.В этом случае у currentDir есть родительский объект с именем «child3», у которого есть родительский элемент с именем «first», у которого есть родительский элемент с именем «root», у которого нет родительского элемента.Как лучше это сделать?Кроме того, любые советы о том, как сделать это лучше, приветствуются - у меня большой опыт программирования, но не очень много в Java.

Редактировать:

Я закончил тем, что создал рекурсивную подпрограмму, которая будет запущена после того, как каталоги будут настроены:

private void setParent(Dir thisDir) {
  //Loop through every subdir
  for(Dir tmp : thisDir.subdirs) {
    //set this as the parent on each sub-dir
    tmp.parent = thisDir;
    //then call setParent on each sub-dir
    setParent(tmp);
  }
}

Мне все еще нужно отслеживать любые изменения в родительском объекте, если каталог перемещен, ноэто работает, пока, по крайней мере.

Ответы [ 3 ]

3 голосов
/ 14 марта 2012

Вы можете иметь ссылку parentDir в каждом Dir объекте.

В конструкторе Dir вы бы сделали что-то вроде

for (Dir subdir : subdirs)
    subdir.parent = this;

Я понимаю, что это вносит некоторые избыточные и раздражающие инварианты в ваш код. Я предполагаю, что альтернатива состоит в том, чтобы иметь простую функцию, которая рекурсивно находит родителя объекта dir путем поиска в корне. Может быть сделано что-то вроде этого:

Dir findParent(Dir root, Dir d) {

    if (Arrays.asList(subdirs).contains(d))
        return this;

    for (Dir subdir : subdirs) {
        Dir parent = findParent(subdir, d);
        if (parent != null)
            return parent;
    }

    return null;
}

Примечание: я настоятельно рекомендую вам использовать пустые массивы вместо null для каталогов, у которых нет дочерних элементов. Это позволяет избежать большого количества условных кодов (операторов if).

0 голосов
/ 14 марта 2012

Либо сохраняйте parentDir для каждого Dir, как предложено aioobe, ищите родителя каждый раз, когда вам это нужно (очень плохая идея), или используйте существующую библиотеку, например, classpath-explorer. Это может просто сделать то, что вам нужно.

В JDK 7 также есть более продвинутые средства обработки файлов, поэтому, если ваша структура Dir () отражает реальную файловую систему, вам может даже не потребоваться реализовывать ее самостоятельно.

0 голосов
/ 14 марта 2012

Добавьте родительскую ссылку к вашему классу Dir и поднимитесь по дереву:

public class Dir {
  public Dir(String name, Dir parent, Dir[] subdirs) {
    this.name = name;
    this.subdirs = subdirs;
    this.parent = parent;
  }
  public String name;         //directory name
  public Dir[] subdirs;       //Sub-directories
  public Dir parent;
}

Но ваша инстанцияция не будет работать ...

...