• ,

level08.lesson11.bonus02 не пойму как так получается

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

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

/* Нужно добавить в программу новую функциональность
Задача: Программа определяет, какая семья (фамилию) живёт в доме с указанным номером.
Новая задача: Программа должна работать не с номерами домов, а с городами:
Пример ввода:
Москва
Ивановы
Киев
Петровы
Лондон
Абрамовичи

Лондон

Пример вывода:
Абрамовичи
*/

public class Solution
{
    public static void main(String[] args) throws IOException
    {
        BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));

        //list of addresses
        HashMap<String, ArrayList<String>> cityMap = new HashMap<String, ArrayList<String>>();
        while (true)
        {
            String city = reader.readLine();
            if (city.isEmpty()) break;
            String secondName = reader.readLine();
            if (secondName.isEmpty()) break;

            //if (cityMap.get(city) == null)
            //{
                cityMap.put(city, new ArrayList<String>());
            //}
            ArrayList<String> secondNameList = cityMap.get(city);
            secondNameList.add(secondName);

        }

        //read home number
        String city = reader.readLine();

        ArrayList<String> secondNameList = cityMap.get(city);

        if (!secondNameList.isEmpty())
        {
            System.out.println(secondNameList.size());
            for (String s : secondNameList)
            System.out.println(s);
        }
    }
}

Данное решение прошло проверку на сервере, но работает не корректно. Если вводить несколько фамилий с одним и тем же городом, то выводится в итоге только последняя. Эмпирическим путем выяснил что проблема в этой части кода:
while (true)
        {
            //if (cityMap.get(city) == null)
            //{
                cityMap.put(city, new ArrayList<String>());
            //}
            ArrayList<String> secondNameList = cityMap.get(city);
            secondNameList.add(secondName);

        }

Если я все правильно понимаю то на строчке
cityMap.put(city, new ArrayList<String>());

программа должна попробовать добавить в Map пару но, в случае если такой ключ уже существует, ничего не сделать и просто вернуть false. Но на деле получается так, что старая пара заменяется на новую. Почему?
Если раскомментировать if все работает как и задумывалось, но хотелось бы таки разобраться.

level08.lesson11.home06

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

import java.util.*;

public class Solution
{
    public static void main(String[] args)
    {
        //пункт 2
        Human grandFather1 = new Human("Александр", true, 60, new ArrayList<Human>(Arrays.asList(father)));
        Human grandFather2 = new Human("Михаил", true, 65, new ArrayList<Human>(Arrays.asList(mother)));
        Human grandMother1 = new Human("Мария", false, 55, new ArrayList<Human>(Arrays.asList(father)));
        Human grandMother2 = new Human("Наталья", false, 60, new ArrayList<Human>(Arrays.asList(mother)));
        Human father = new Human("Евгений", true, 35, new ArrayList<Human>(Arrays.asList(child1, child2, child3)));
        Human mother = new Human("Евгения", false, 35, new ArrayList<Human>(Arrays.asList(child1, child2, child3)));
        Human child1 = new Human("Саша", false, 8);
        Human child2 = new Human("Ирина", false, 10);
        Human child3 = new Human("Андрей", true, 15);
        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
    {
        //пункт 1
        String name;
        boolean sex;
        int age;
        ArrayList<Human> children;

        public Human(String name, boolean sex, int age){
            this.name = name;
            this.sex = sex;
            this.age = age;
        }
        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;
        }
    }

}

не работает вот это место
Human grandFather1 = new Human("Александр", true, 60, new ArrayList<Human>(Arrays.asList(father)));
        Human grandFather2 = new Human("Михаил", true, 65, new ArrayList<Human>(Arrays.asList(mother)));
        Human grandMother1 = new Human("Мария", false, 55, new ArrayList<Human>(Arrays.asList(father)));
        Human grandMother2 = new Human("Наталья", false, 60, new ArrayList<Human>(Arrays.asList(mother)));
        Human father = new Human("Евгений", true, 35, new ArrayList<Human>(Arrays.asList(child1, child2, child3)));
        Human mother = new Human("Евгения", false, 35, new ArrayList<Human>(Arrays.asList(child1, child2, child3)));

голову сломал, не понимаю, как правильно добавить элементы в список при инициации
объясните пожалуйста, что не так делаю
  • ,

Интерфейсы.

Доброго дня всем. Начал изучать такую интересную тему как интерфейсы. Некоторые задачи выполняются чисто интуитивно, но не совсем понятно как что работает. Ниже выкладываю код программы, которая успешно прошла проверку на сервере.

/* Исправление ошибок
1. Переделай наследование в классах и интерфейсах так, чтобы программа компилировалась и продолжала делать то же самое.
2. Класс Hobbie должен наследоваться от интерфейсов Desire, Dream.
*/

public class Solution
{

    public static void main(String[] args) throws Exception
    {
        System.out.println(Dream.HOBBIE.toString());
        System.out.println(new Hobbie().INDEX);
    }

    interface Desire
    {
    }

    interface Dream //implements Hobbie
    {
        static Hobbie HOBBIE = new Hobbie();
    }

    static class Hobbie implements Desire, Dream
    {
        static int INDEX = 1;

        @Override
        public String toString()
        {
            INDEX++;
            return "" + INDEX;
        }
    }

}

Хотелось бы описать как я понимаю её, но мысли очень разбросаны. Не могли бы вы в 2х словах описать работу данной программы, а именно что происходит в этом интерфейсе:
interface Dream //implements Hobbie
    {
        static Hobbie HOBBIE = new Hobbie();
    }

Спасибо.