私は各親ノードに複数の息子を入れることができ、それぞれの息子には親が1人しかいないようなツリー構造で作業しています。ファイルシステム内のディレクトリ構造。ソフトウェア設計パターン:親に息子を追加し、親を息子に割り当てます。
私はこれらの多くを行っていますが、私は今あなたと共有しようとしているよりも、鶏と卵の問題を解決するためのさまざまなアプローチがありますが、それを解決するために私が今まで無視してきたパターン。
親を息子ノードに設定すると、親はこの新しいノードをその子孫リストに追加しなければならず、息子を親に追加すると、息子はその親を更新しなければならず、すべてが一貫性のある木を維持するために、そうでなければ父親として認識しない息子を持つ両親に終わる可能性があります...
例を見てみましょう(JAVA )、コードの問題のために、より良いコードに示されている段落で説明したよりも:そこのarが
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);
}
}
OK、これは、簡単のため、最も単純な形式であります他の対処すべき事柄(例えば、前の親からの息子の削除)。私はあなたが既にここにある再帰的な問題を既に見ていると確信しています。
多かれ少なかれ明白なアプローチは、息子はすでに親としてこれを割り当てられているかどうかを実行時にチェックすることですので、私はとしてこれらのメソッドを書き換えたい:
public void addSon(Node son) {
this.sons.add(son);
if (son.parent != this)
son.setParent(this);
}
でも存在することになるのだろうかこれを解決するより良いアプローチ。例えば、いくつかの冗長な呼び出しを節約する別のアプローチは、静的メソッドを使用して可能性があり、何かのように:だから、提供assignSon一つは、自分の父親に息子を関連付けるために使用できる唯一の方法である
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;
}
}
、これは鶏を解決します-an-卵の問題が、あなたのような何かを行うことができます前に、どこ、あなたが知っている、それが外部から利用することも何とかあまり直感的であり、そして、あなたはより多くのコードを記述する必要があります:
son.setParent(parent);
それとも
parent.addSon(son);
あなたが今書くことでしょう:
Node.assignSon(parent, son);
をそれは大したことではないのですが、それでも...よく、何でも。あなたがこの問題の最適なアプローチを知っていて、あなたがこのコミュニティと共有したいのであれば、私は1人に非常に感謝します!
TIA!
あなたの 'removeSon'メソッドでは' son'の親を扱わなければなりません。あなたは親から息子を取り除いているので、「息子」はそれを認識していません。 –
どういう意味ですか?オブジェクトの観点から 'removeSon'を見なければならないので、メソッドは"私 "(もし存在すれば)から息子を取り除いています。このメソッドは 'addSon'メソッドで息子の親から呼び出されます。私がやっていることは、「大丈夫、「b」の子として「d」を追加しています。「b.addSon(d)」、「ehy'd」です。 " 「はい、それは「a」なのでnullではありません。 "ああ、クール、私を許してください、あなたはあなたの息子から" d "を取り除くことができますか?" - > 'd.parent.removeSon(d)'。 – Enrichman
@Enrichmanこれは本当にうまく見えますが、ここでも2つの問題があります。まず、単純にこれを扱っていないかもしれませんが、とにかくaddSonメソッド内では、まず息子リストにその息子がいないことを確認する必要があります。そうしないと、もう一度息子となりますそれは父親を知っているが、息子を認めない父親である。そして、2番目に、removeSonメソッドpublicと最後のツリーを取って、そのクラスの外からremoveSon(b)を呼び出すとしましょう。その時点から 'a'は 'b'について何も知らないでしょうが、 'b' aは彼の父親です。 –