-1
public class Person {

    private String name;
    private boolean adopted;
    private String parent;
    private List<String> children;

    public Person(String Aname) {
        name = Aname;
        children = new ArrayList<String>();
        adopted = false;
    }

    public void adopt(Person person) {
        if (!person.adopted && !person.name.equals(name)
                && children.size() <= 10) {
            person.parent = name;
            // System.out.println(parent);
            // children=person.name;
            for (int i = 0; i < children.size(); i++) {
                children.add(i, person.name);
            }
            // System.out.println(children);
            adopted = true;
        }
    }

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

    public void disown(Person person) {

    }

    public String toString() {
        if (children.size() == 0 && parent == null) {
            return name + " Parent: No parent.  Children: No children ";
        } else if (children.size() == 0) {
            return name + " Parent: " + parent + " Children: No children";
        } else if (parent == null) {
            String list = null;
            for (int i = 0; i < children.size(); i++) {
                list = children.get(i);
            }
            return name + " Parent: No Parent " + "Children: " + list;
        } else {
            String list = null;
            for (int i = 0; i < children.size(); i++) {
                list = children.get(i);
            }
            return name + " Parent: " + parent + " Children: " + list;
        }
    }
}

これで、 person.name を arraylist の子に追加しようとしていますが、追加できません。リストを初期化してから、リストに名前を追加しています。Adopt メソッドを使用して子をリストに追加しています。ここで何が間違っているのか教えてください。

4

5 に答える 5

1

プロパティは非公開です。setter と getter を配置してから、getName() プロパティにアクセスしてみてください。

于 2013-10-28T20:39:34.457 に答える
1

問題は、新しい ArrayList(); を作成した後だと確信しています。リストに値を割り当てないため、children.size() に基づいて反復する場合、常に 0 から 0 まで反復し、次のスニペットに子を追加することはありません。

for (int i = 0; i < children.size(); i++) {
            children.add(i, person.name);
        }

@summerbulbの提案に従って:person.name現在のこれで採用されるべきなので、あなたはただやるべきです

children.add(person.name)

また、adopt メソッドの最後に、this (採用者) ではなく、person (パラメーター) を採用済みとしてマークしたいと思うので、変更しても構いません。

person.adopted=true;

ただの代わりにadopted=true;

于 2013-10-28T20:39:48.627 に答える
1

次のコードは正しくありません。

for (int i = 0; i < children.size(); i++) {
    children.add(i, person.name);
}

呼び出すたびAdopt(person)に、リスト内のすべての子ではなく、その子を追加します。

使用してみてください:

children.add(person.name);

編集: わかりました、上記は正しいですが、クリストバル・デ・レオンの答えは、あなたが経験していることの説明です.

于 2013-10-28T20:44:08.873 に答える
0

方法を確認してくださいtoString。すべての子が印刷されているかどうかはわかりません。たとえば、parent が NULL ではなく、children.size() > 0 の場合を見てください。

String list = null;
for (int i = 0; i < children.size(); i++) {
  list = children.get(i);
}
return name + " Parent: " + parent + " Children: " + list;

ここでは、すべての子を反復処理して、リストの最後の子の名前を取得し、それを親の名前と一緒に返します。

その他:子供もクラスに参加できるかどうかを確認してくださいPerson

于 2013-10-28T20:42:10.863 に答える
0

arraylist "children" の項目数は 0 です。

この部品コードを見てください:

for (int i = 0; i < children.size(); i++) {
    children.add(i, person.name);
}

子のすべてのオブジェクトに対して、同じ名前を設定します。

したがって、名前を 0 回設定します。つまり、出力もありません。

メインで作成したすべての人の配列が必要だと思います。採用コードを次のように変更します。

public void adopt(Person person) {
    if (!person.adopted && !person.name.equals(this.name)) {
        person.parent = name;
        children.add(person.name);
        person.adopted = true;
    }
}

属性のゲッターを作成するか、次のように公開します。

パブリック文字列名;

あなたのメインで:

Person[] persons = new Person[5];
persons[0] = new Person("Dude");
persons[1] = new Person("Dude's child");

persons[0].adopt(persons[1]);
于 2013-10-28T20:40:01.920 に答える