0

私はジェネリックとツリー構造を理解しようとしており、次の問題に固執しています...

私は3つのクラスを作成しました1)Node 2)Person 3)NodeTest

import java.util.*;

public class Node<T>
{
    private Node<T> root; // a T type variable to store the root of the list
    private Node<T> parent; // a T type variable to store the parent of the list
    private List<Node<T>> children = new ArrayList<Node<T>>(); // a T type list to store the children of the list

    // default constructor
    public Node(){ }

    // constructor overloading to set the parent
    public Node(Node<T> parent)
    {
        this.setParent(parent);
        //this.addChild(parent);
    }

    // constructor overloading to set the parent of the list  
    public Node(Node<T> parent, Node<T> child)
    {
        this(parent);
        this.children.add(child);
    }


    public void addChild(Node<T> child)
    {
        this.children.add(child); // add this child to the list
    }

    public void removeChild(Node<T> child)
    {
        this.children.remove(child); // remove this child from the list
    }

    public Node<T> getRoot() {
        return root;
    }

    public boolean isRoot()
    {
        return this.root != null; // check to see if the root is null if yes then return true else return false
    }

    public void setRoot(Node<T> root) {
        this.root = root;
    }

    public Node<T> getParent() {
        return parent;
    }

    public void setParent(Node<T> parent) {
        this.parent = parent;
    }

    public boolean hasChildren()
    {
        return this.children.size()>0;
    }

    public Node<T>[] children()
    {
        return (Node<T>[]) children.toArray(new Node[children.size()]);
    }

    public Node<T>[] getSiblings()
    {

        if(this.isRoot()==false)
        {
            System.out.println("this is not root");
        }

        List<Node<T>> tempSiblingList = new ArrayList<Node<T>>();

        //this.parent.children() isn't working for me
        //hence i tried to get around it next two lines
        Node<T> parent =  this.parent;

        Node<T>[] children =  parent.children();

        for(int i=0; i<children.length; i++)
        {
            if(this!=children[i])
            {
                tempSiblingList.add(children[i]);
            }
        }
        return (Node<T>[]) tempSiblingList.toArray(new Node[children.length]);
    }
}






public class Person {

    private String name;
    private int age;
    private String status;

    public Person(String name, int age, String status)
    {
        this.setName(name);
        this.setAge(age);
        this.setStatus(status);
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

    public String getStatus() {
        return status;
    }

    public void setStatus(String status) {
        this.status = status;
    }
}

私の質問は、Node クラスの Person クラスを初期化する方法です...

私が試してみました

Person rootPerson = new Person("root", 80, "Alive");

Node<Person> root = new Node<Person>(rootPerson);

しかし、それは私にはうまくいきません...

getSibilings() のヘルプも必要です

4

2 に答える 2

1

を必要とするコンストラクタに Person を渡しています。Node<Person>

これがツリーの場合、親の変数とツリーに含まれるオブジェクトの両方が必要です。

public Node(Node<T> parent,T value)
于 2012-04-23T00:08:23.960 に答える
0

ノード クラスには、値を格納するためのメンバーがありません。

class Node<T>
{
    ...
    private T value;
    ...
}

Node要素の型を取るコンストラクターがありません:

...
public node (T value)
{
    this.value = value;
}
...

そして、定義上、兄弟とは、自分ではない親の子供です。

public Node<T>[] getSiblings ( )
{
    if (parent == null)
        return null;

    List<Node<T>> siblings = new ArrayList<Node<T>>( );
    Collections.copy(siblings, parent.children);
    siblings.remove(this);

    return siblings.toArray(new Node<T>[]{});
}

警告: 上記のコードはいずれもテストされていません。

また、家系図をモデルにしているように見えますか? もしそうなら、あなたが従っている厳密な階層モデルは実際には現実をうまくモデル化していないことに注意してください.

編集:コメントに応じて。

クラスを初期化するには、まず上で述べた変更を行う必要があります。それぞれNodeが値を格納できるようにメンバーを作成し、値を取得できるコンストラクターを作成します。

この点で、@spinning_plate は正しいです。私が示した値を取るものと同様に、値を取るものと親が必要です。それらのコンストラクターの完全な実装は、次のようになります。

public Node<T> (Node<T> parent, T value)
{
    this.parent = parent;
    this.value = value;

    // Don't forget: if you have a parent, you are their child.
    parent.addChild(this);
}

次に、次のように単純なツリーを作成できます。

Person rootPerson = new Person("root", 80, "alive");
Node<Person> rootNode = new Node<Person>(rootPerson); // This uses my constructor

Person son = new Person("son", 50, "alive");
Node<Person> sonNode = new Node<Person>(rootPerson, son); // This uses spinning_plate's constructor
于 2012-04-23T00:08:42.007 に答える