gpt4 book ai didi

java - 软件设计模式 : add a son to a parent, 并将父类分配给子类

转载 作者:塔克拉玛干 更新时间:2023-11-03 04:41:24 24 4
gpt4 key购买 nike

我在树状结构中工作,其中每个父节点可以包含多个儿子,而每个儿子只能有一个父节点,很像文件系统中的目录结构。

我已经做了很多这样的事情,并且有很多不同的方法来解决鸡和蛋问题,而不是我现在要与你分享的,但我想知道是否有更多或不太理想的通用设计模式到目前为止我一直忽略解决它。

现在的问题是,当您将父节点设置为子节点时,父节点必须将这个新节点添加到其内部后代列表中,而当您将儿子添加到父节点时,儿子必须更新其父节点,所有为了保持一棵连贯的树,否则你最终可能会得到 parent 的儿子不承认他们是父亲,反之亦然......

让我们看一个示例(我将使用 JAVA),因为代码问题在代码中显示比在段落中解释更好:

class Node {
private Node parent;
private ArrayList<Node> sons=new ArrayList<Node>();

public void setParent(Node parent) {
this.parent = parent;
parent.addSon(this);
}

public void addSon(Node son) {
this.sons.add(son);
son.setParent(this);
}

}

好的,为了简单起见,这是最简单的形式,尽管还有其他事情要处理(例如,从其先前的父级中移除子级)。我很确定您已经看到我们这里的递归问题。

一个或多或少明显的方法是在运行时检查儿子是否已经将其指定为其父级,因此我将这些方法重写为:

    public void addSon(Node son) {
this.sons.add(son);
if (son.parent != this)
son.setParent(this);
}

但我想知道是否有更好的方法来解决这个问题。例如,另一种可以节省一些冗余调用的方法是使用静态方法,例如:

 class Node {
private Node parent;
private ArrayList<Node> sons=new ArrayList<Node>();

public static assignSon(Node parent, Node son) {
parent.sons.add(son);
son.parent = parent;
}
}

所以,假设 assignSon 是唯一可以用来将儿子与父亲联系起来的方法,这就解决了先有鸡还是先有蛋的问题,但从某种程度上来说,从外部使用它也不那么直观,您将不得不编写更多代码,你知道,你可以在哪里做这样的事情:

son.setParent(parent);

或者

parent.addSon(son);

你现在要写:

Node.assignSon(parent, son);

这没什么大不了的,但仍然……好吧,不管怎样。如果您知道解决这个问题的最佳方法并且想与这个社区分享,我将非常感激!

TIA!

最佳答案

我会使用与@uoyilmaz 相同的代码,但请记住更新旧的父级(如果已经存在),否则如果您分配一个已经分配给其他人的儿子,您将得到一些不一致。

例如,如果来自这棵树:

   a
/ | \
b c d

您将 d 作为 b 的儿子移动

  a
/ \
b c
|
d

a 仍将引用 d 节点。

所以也许这样的事情应该可行:

class Node {
private Node parent;
private ArrayList<Node> sons=new ArrayList<Node>();

private void setParent(Node parent) {
this.parent = parent;
}

public void addSon(Node son) {
if(!this.sons.contains(son)) {
this.sons.add(son);

if(son.parent != null) {
son.parent.sons.remove(son);
}

son.setParent(this);
}
}
}

关于java - 软件设计模式 : add a son to a parent, 并将父类分配给子类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39669214/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com