【问题标题】:Finding the parent object in a self-referencing Java class在自引用 Java 类中查找父对象
【发布时间】:2012-03-13 20:05:40
【问题描述】:

我创建了一个类来模拟我正在开发的程序(基于文本的游戏)的文件结构。这是一个简化版:

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);
  }
}

如果目录被移动,我仍然需要跟踪对父级的任何更改,但这至少现在有效。

【问题讨论】:

    标签: java class parent self-reference


    【解决方案1】:

    您可以在每个 Dir 对象中有一个 parentDir 引用。

    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 语句)。

    【讨论】:

    • 这种方法的缺点是随着子目录数量的增加,步骤数也会增加。我可以实现一个自上而下(其中“root”是顶层)递归子目录查找器,一旦它被填充就运行......我希望会有某种内置的父引用,但是唉,情况似乎并非如此。不过,感谢您提供空数组建议,这是个好主意。
    【解决方案2】:

    为你的 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;
    }
    

    但是你的单行实例化不起作用......

    【讨论】:

    • 这会导致先有鸡还是先有蛋的问题,因为您需要用户同时提供子级和父级来构造 Dir 对象。
    【解决方案3】:

    要么存储每个 Dir 的 parentDir,就像 aioobe 建议的那样,每次你想要的时候都搜索父级(非常糟糕的主意),或者使用现有的库,比如 classpath-explorer。那可能只是做你需要的。

    JDK 7 也有一些更高级的文件处理功能,所以如果你的 Dir() 结构反映了实际的文件系统,你甚至可能不需要自己实现它。

    【讨论】:

      猜你喜欢
      • 2020-06-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-07-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多