level08.lesson11.home06

Хай. Раньше проходил задания более менее нормально. Но тут столкнулся с трудностями. Решил задачу... но не могу понять как я ее решил :)

Вопрос такой: почему я не могу использовать в конструкторе надпись:
this.children.addAll(children)


в таком случае, если у детей нету детей, то при создании обьекта (ребенка) я могу написать
Human child = new Human("...", false, 22, null)


Вообщем, в таком случае оно мне ошибку стреляет..

вот такая каша у меня..

package com.javarush.test.level08.lesson11.home06;

/* Вся семья в сборе
1. Создай класс Human с полями имя (String), пол (boolean), возраст (int), дети (ArrayList<Human>).
2. Создай объекты и заполни их так, чтобы получилось: два дедушки, две бабушки, отец, мать, трое детей.
3. Вывести все объекты Human на экран.
*/

import java.util.ArrayList;

public class Solution
{
    public static void main(String[] args)
    {
        //это потомки от первых дедушек и бабушек
        ArrayList<Human> generation1_family1 = new ArrayList<Human>();
        //потомки от других бабушек и дедушек
        ArrayList<Human> generation1_family2 = new ArrayList<Human>();
        //детки
        ArrayList<Human> generation2 = new ArrayList<Human>();
        //создаем детей
        Human child1 = new Human("Ромка", true, 23, new ArrayList<Human>());
        Human child2 = new Human("Наташа", false, 28, new ArrayList<Human>());
        Human child3 = new Human("Витя", true, 21, new ArrayList<Human>());
        //добавляем в коллекцию
        generation2.add(child1);
        generation2.add(child2);
        generation2.add(child3);
        //создаем родителей, впихиваем детей сразу
        Human father = new Human("Папа Коля", true, 42, generation2);
        Human mother = new Human("Мама Света", false, 35, generation2);
        // после создания родителей запихиваем в коллекцию причем папу в одну, маму в другую
        generation1_family1.add(father);
        generation1_family2.add(mother);
        //создаем дедушку, впихиваем в одного деда папу, в другого деда маму
        Human grandFather1 = new Human("Дедушка Вася", true, 78, generation1_family1);
        Human grandFather2 = new Human("Дедушка Петя", true, 78, generation1_family2);
        //по тому же принципу создаем бабушек
        Human grandMother1 = new Human("Бабушка Вера", false, 99, generation1_family1);
        Human grandMother2 = new Human("Бабушка Дуня", false, 125, generation1_family2);


        //печатаем
        System.out.println(grandFather1);
        System.out.println(grandFather2);
        System.out.println(grandMother1);
        System.out.println(grandMother2);
        System.out.println(father);
        System.out.println(mother);
        System.out.println(child1);
        System.out.println(child2);
        System.out.println(child3);
    }

    public static class Human
    {
        private String name;
        private boolean sex;
        private int age;
        private ArrayList<Human> children;

        public Human(String name, boolean sex, int age, ArrayList<Human> children)
        {
            this.name = name;
            this.sex = sex;
            this.age = age;
            this.children = children; // ?? почему нельзя было написать . . this.children.addAll(children)
        }

        public String toString()
        {
            String text = "";
            text += "Имя: " + this.name;
            text += ", пол: " + (this.sex ? "мужской" : "женский");
            text += ", возраст: " + this.age;

            int childCount = this.children.size();
            if (childCount > 0)
            {
                text += ", дети: "+this.children.get(0).name;

                for (int i = 1; i < childCount; i++)
                {
                    Human child = this.children.get(i);
                    text += ", "+child.name;
                }
            }

            return text;
        }
    }

}

25 комментариев

IgorChaiun
this.children = children; // ?? почему нельзя было написать . . this.children.addAll(children)

потому что children у тебя еще не инициализирован, ссылка есть, а объект ты еще не создал.
Если бы ты так написал
private ArrayList<Human> children = new ArrayList<Human>()
, то все бы работало
jeronimo1111
аа, доперло вроде...

т.е.
Human child1 = new Human("Ромка", true, 23, new ArrayList<Human>());

здесь мы создаем пустой объект, а в конструкторе, мы присваиваем ссылке этот самый обьект..

this.children = children;//присваиваем ссылке, адрес объекта. . 


спасибо
eniqen
  • eniqen
  • 0
  • Комментарий отредактирован 2014-12-29 15:40:13 пользователем eniqen
/*.*/
F0RIS
Ребят, ну чего вы в мэйне такую кашу делает? неужели нельзя так:

        ArrayList<Human> family = new ArrayList<Human>();
        ArrayList<Human> kids = new ArrayList<Human>();
        ArrayList<Human> parents = new ArrayList<Human>();


        kids.add(new Human("kid1", true, 3, null));
        kids.add(new Human("kid2", true, 4, null));
        kids.add(new Human("kid3", true, 5, null));

        parents.add(new Human("Father", true, 25, kids));
        parents.add(new Human("Mother", false, 25, kids));

        family.add(new Human("дедушка1", true, 50, parents));
        family.add(new Human("дедушка2", true, 50, parents));
        family.add(new Human("бабушка1", false, 50, parents));
        family.add(new Human("бабушка2", false, 50, parents));

        family.addAll(parents);
        family.addAll(kids);

        for (Human item : family)
            System.out.println(item);


Только при таком варианте надо будет кое-что поправить в методе toString, т.к. в нем не учтено, что могут передать null. Ну, а зачем создавать лишние списки и передавать детям?)
Beherith
F0RIS
хорошее решение, компактненько.
Только у тебя там жёсткое кровесмешение в семье свингеров получилось :)
Что ты имел ввиду под
кое-что поправить в методе toString, т.к. в нем не учтено, что могут передать null
?
Я добавил в конструктор
if (children != null) this.children = children;
            else this.children = new ArrayList<Human>();

работает без изменения в to String, но не знаю насколько правильно.
utushalla
Уверен что криво, но всё прошло =)

public class Solution
{

    public static void main(String[] args)
    {
        Human kid1 = new Human("kid1",true,13,null);
        Human kid2 = new Human("kid2",true,14,null);
        Human kid3 = new Human("kid3",true,12,null);

        Human father = new Human("father",true,60,kid1);

        Human mother = new Human("mother",false,55,kid2);

        Human ded1 = new Human("ded1",true,60,father);
        Human ded2 = new Human("ded2",true,65,mother);

        Human babka1 = new Human("babka1",false,55,mother);
        Human babka2 = new Human("babka2",false,50,father);
        ArrayList<Human> family = new ArrayList<Human>();
        family.add(kid1);
        family.add(kid2);
        family.add(kid3);
        family.add(father);
        family.add(mother);
        family.add(ded1);
        family.add(ded2);
        family.add(babka1);
        family.add(babka2);
        for (Human humy : family)
        {
            System.out.println(humy.toString());
        }

    }

    public static class Human
    {
        String name;
        boolean sex;
        int age;
        ArrayList<Human> children = new ArrayList<Human>();

        public  Human(String name,boolean sex,int age,Human human )
        {
            this.name = name;
            this.sex = sex;
            this.age = age;
            if (human != null)
                children.add(human);
            else this.children = new ArrayList<Human>();



        }

        public String toString()
        {
            String text = "";
            text += "Имя: " + this.name;
            text += ", пол: " + (this.sex ? "мужской" : "женский");
            text += ", возраст: " + this.age;

            int childCount = this.children.size();
            if (childCount > 0)
            {
                text += ", дети: "+this.children.get(0).name;

                for (int i = 1; i < childCount; i++)
                {
                    Human child = this.children.get(i);
                    text += ", "+child.name;
                }
            }

            return text;
        }
    }

}
Rodgelius
А где kid3 потерялся и почему у мамы 1 ребенок, а у папы 2 ребенок?))
thinker
Чего Вы придираетесь? Уже хорошо, что папа всего один :)
b_rhyme
Решение, предложенное F0RIS — как по мне не правильно выполнено.
В плане компактности — тут и правда код выглядит лучше, по крайней мере, лучше чем у меня. Но суть вопроса не в этом.
Логика задачи такова, что требуется вывести детей своих родителей. То есть, у объектов Father & Mother — должны быть разные родители (они же дедушки & бабушки). А у Вас получается, вот что:
Имя: дедушка1, пол: мужской, возраст: 50, дети: Father, Mother
Имя: дедушка2, пол: мужской, возраст: 50, дети: Father, Mother
Имя: бабушка1, пол: женский, возраст: 50, дети: Father, Mother
Имя: бабушка2, пол: женский, возраст: 50, дети: Father, Mother

Так происходит из-за того, что вы передаете параметром ArrList parents при создании «дедушек и бабушек», не разделяя их.

utushalla , интересно, что у вас прошло проверку. Ведь вы в конструкторе передавали объект типа Human, а не того, что просили в задаче — объект типа ArrayList.
arsis-gambit
что за хрень почему не проходит тестирование

package com.javarush.test.level08.lesson11.home06;

/* Вся семья в сборе
1. Создай класс Human с полями имя (String), пол (boolean), возраст (int), дети (ArrayList<Human>).
2. Создай объекты и заполни их так, чтобы получилось: два дедушки, две бабушки, отец, мать, трое детей.
3. Вывести все объекты Human на экран.
*/

import java.util.ArrayList;
import java.util.HashMap;
import java.util.Map;

public class Solution
{
    public static void main(String[] args)
    {
        //напишите тут ваш код
        Map<String, Human> family = new HashMap<String, Human>();
        ArrayList<Human> list = new ArrayList<Human>();

        family.put("kid1", new Human("kid1", Human.MALE, 11, list ) );
        family.put("kid2", new Human("kid2", Human.MALE, 12, list ) );
        family.put("kid3", new Human("kid3", Human.FEMALE, 13, list) );

        list.add( family.get("kid1") );
        list.add( family.get("kid2") );
        list.add( family.get("kid3") );

        family.put("father", new Human("Name_f", Human.MALE, 40, list) );
        family.put("mather", new Human("Name_m", Human.FEMALE, 35, list) );

        list = new ArrayList<Human>();
        list.add( family.get("father") );

        family.put( "gFather1", new Human("ded1", Human.MALE, 70, list ) );
        family.put( "gMather1", new Human("baba1", Human.FEMALE, 65, list) );

        list = new ArrayList<Human>();
        list.add( family.get("mather") );

        family.put( "gFather2", new Human("ded2", Human.MALE, 70, list) );
        family.put( "gMather2", new Human("baba2", Human.FEMALE, 65, list) );

        for (Map.Entry<String, Human> m: family.entrySet())
            System.out.println(m.getValue().toString());

    }

    public static class Human
    {
        //напишите тут ваш код
        public static final boolean MALE = true;
        public static final boolean FEMALE = false;

        String name;
        boolean sex;
        int age;
        ArrayList<Human> children;

        public Human(String name, boolean sex, int age, ArrayList<Human> children)
        {
            this.name = name;
            this.sex = sex;
            this.age = age;
            this.children = children;
        }

        public String toString()
        {
            String text = "";
            text += "Имя: " + this.name;
            text += ", пол: " + (this.sex ? "мужской" : "женский");
            text += ", возраст: " + this.age;

            int childCount = this.children.size();
            if (childCount > 0)
            {
                text += ", дети: "+this.children.get(0).name;

                for (int i = 1; i < childCount; i++)
                {
                    Human child = this.children.get(i);
                    text += ", "+child.name;
                }
            }

            return text;
        }
    }

}
arsis-gambit
да нормально ) проходит тестирование
Grif
  • Grif
  • 0
  • Комментарий отредактирован 2016-02-09 19:01:18 пользователем Grif
F0RIS Зарисовался… ну почти зарисовался и мне охота :)
public class Solution
{
    public static void main(String[] args)
    {
        //напишите тут ваш код
        ArrayList<Human> family = new ArrayList<>();
        family.add(new Human("Сын", true, 10, null));
        family.add(new Human("Сын", true, 12, null));
        family.add(new Human("Дочь", false, 2, null));
        family.add(new Human("Отец", true, 37, family.get(0), family.get(1), family.get(2)));
        family.add(new Human("Мать", false, 34, family.get(0), family.get(1), family.get(2)));
        family.add(new Human("Дед1", true, 57, family.get(3)));
        family.add(new Human("Баба1", false, 54, family.get(3)));
        family.add(new Human("Дед2", true, 58, family.get(4)));
        family.add(new Human("Баба2", false, 53, family.get(4)));

        for (Human human : family) {
            System.out.println(human);
        }
    }

    public static class Human
    {
        //напишите тут ваш код
        String name;
        boolean sex;
        int age;
        ArrayList<Human> children = new ArrayList<>();

        public Human(String name, boolean sex, int age, Human... child) {
            this.name = name;
            this.sex = sex;
            this.age = age;
            if (child != null) {
                for (Human human : child) {
                    this.children.add(human);
                }
            }
        }
    }

По мне так интереснее и ни какого кровосмешения :)
toString() как в задании ничего не менял, просто втискивать сюда не захотел. :) А вообще на самом деле и этот код в Майне слишком большой, считается хорошим тоном если в этом методе до 5-ти строк :)
Multya
Добрый день.
А можешь пояснить запись в конструкторе «Human… child». Если правильно понимаю, то это заменяет все перечисления?
Grif
  • Grif
  • 0
  • Комментарий отредактирован 2016-08-12 00:18:19 пользователем Grif
Это одна из форм записи массива уже не помню почему именно так записал.
Фраза перечисления здесь несколько не уместна, потому что в Java под перечислениями понимают другие конструкции, которые называются — Enam
Grif
Я даже не уверен, что сейчас выбрал бы такой стиль решения.
Multya
мне кажется, ругался, если напсать «ArrayListchild», типа много аргументов (family.get(0), family.get(1), family.get(2))
Grif
public class Solution {
    public Solution(List<String> list) {

    }

    public Solution(String [] args) {

    }
}


Такие конструкторы вполне допустимы, но конечно код надо будет поменять немного.
Human… child — такая конструкция конечно имеет преимущество в том, что однотипные аргументы можно писать через запятую.
Когда я сказал, что не уверен на счёт стиля, так это я сказал потому что мне в целом решение не очень нравится. Одна из главных фишек Java — это максимальная читабельность, прозрачность и ясность.
WeLLus
Gift — спасибо за идею с «Human… child».
В итоге получилось так:
public static void main(String[] args) {

        Human child1 = new Human("child1",15,true);
        Human child2 = new Human("child2",10,false);
        Human child3 = new Human("child3",5,true);

        Human father = new Human("father",45,true, child1,child2,child3);
        Human mother = new Human("mother",40,false, child1,child2,child3);

        Human grandfather1 = new Human("grandfather1",70,true, father);
        Human grandmother1 = new Human("grandmother1",65,false, father);

        Human grandfather2 = new Human("grandfather2",75,true,mother);
        Human grandmother2 = new Human("grandmother2",60,false,mother);


        System.out.println(child1.toString());
        System.out.println(child2.toString());
        System.out.println(child3.toString());

        System.out.println(father.toString());
        System.out.println(mother.toString());

        System.out.println(grandfather1.toString());
        System.out.println(grandmother1.toString());
        System.out.println(grandfather2.toString());
        System.out.println(grandmother2.toString());

    }

    public static class Human {
        String name;
        int age;
        boolean sex;
        ArrayList<Human> children;

        public Human(String name, int age, boolean sex, Human... children) {
            this.name = name;
            this.age = age;
            this.sex = sex;
            this.children = new ArrayList<Human>();

            if (children != null) for (Human people : children) this.children.add(people);
        }


вот еще мне не нравится, перечислять вручную вывод всех System.out'ов. Интересно можно как-то не перечисляя, вывести (или получить) имена всех переменных одного типа? В данном случае Human…
polka
  • polka
  • 0
  • Комментарий отредактирован 2017-02-11 16:05:10 пользователем polka
что значит… в условии конструктора? извиняюсь не заметил коменты )
Corwin
  • Corwin
  • 0
  • Комментарий отредактирован 2016-03-28 12:46:11 пользователем Corwin
Вот интересно почему ни кто не использует перегружаемый конструктор, зачем пихать null и переписывать toString, если можно сделать так?
<code>public static class Human
{
public Human(String name, boolean sex, int age){
this.name = name;
this.sex = sex;
this.age = age;
}

public Human(ArrayList<Human> children, String name, boolean sex, int age){
this.children = children;
this.name = name;
this.sex = sex;
this.age = age;
}</code>
ajlk05
ять… точно! совсем голова работать к вечеру перестала. Спасибо Corwin
Corwin
Не за что, обращайтесь если что))
Snuf
часа 3 сидел(тупил) думал над этой задачей… а оказалось все так просто. ArrayList в параметрах сбил меня с толку.
megamind235
тоже туплю — ArrayList в конструктор не могу вставить. Не подскажешь?
sergey_b
Лютый пиндец. Решал часа 2. Сначала не понял НИЧЕГО. Потом понял что-то, только не понял что именно. Потом посмотрел как решали эту задачу другие. В итоге что-то как-то сделал. Смысл программы понял, но все равно такое ощущение, что ничего не понял.

import java.util.ArrayList;

public class Solution {
    public static void main(String[] args) {
        //напишите тут ваш код

        ArrayList<Human> fatherArray = new ArrayList<Human>();
        ArrayList<Human> kids = new ArrayList<Human>();
        ArrayList<Human> motherArray = new ArrayList<Human>();

        Human kid1 = new Human("kid1",true,13,null);
        Human kid2 = new Human("kid2",true,14,null);
        Human kid3 = new Human("kid3",true,14,null);

        kids.add(kid1);
        kids.add(kid2);
        kids.add(kid3);
        
        Human father = new Human("father", true, 40, kids);
        Human mother = new Human("mother", false, 40, kids);

        fatherArray.add(father);
        motherArray.add(mother);

        Human ded1 = new Human("ded1", true, 80, fatherArray);
        Human babka1 = new Human("babka1", false, 80, fatherArray);

        Human ded2 = new Human("ded2", true, 80, motherArray);
        Human babka2 = new Human("babka1", false, 80, motherArray);


        System.out.println(kid1);
        System.out.println(kid2);
        System.out.println(kid3);
        System.out.println(father);
        System.out.println(mother);
        System.out.println(ded1);
        System.out.println(ded2);
        System.out.println(babka1);
        System.out.println(babka2);

    }

    public static class Human {

        String name;
        boolean sex;
        int age;
        ArrayList<Human> children;
        //напишите тут ваш код

        public Human(String name, boolean sex, int age, ArrayList<Human> children)
        {
            this.name = name;
            this.sex = sex;
            this.age = age;

            if(children==null)
                {
                this.children = new ArrayList<Human>();
                }
            else
                {
                this.children = children;
                }

        }

        public String toString() {
            String text = "";
            text += "Имя: " + this.name;
            text += ", пол: " + (this.sex ? "мужской" : "женский");
            text += ", возраст: " + this.age;

            int childCount = this.children.size();
            if (childCount > 0) {
                text += ", дети: " + this.children.get(0).name;

                for (int i = 1; i < childCount; i++) {
                    Human child = this.children.get(i);
                    text += ", " + child.name;
                }
            }
            return text;
        }
    }

}
Только зарегистрированные и авторизованные пользователи могут оставлять комментарии.