Вы достигли нового уровня

Уровень 8

Глобальный рынок труда

Если вы живете в маленькой и/или развивающейся стране, на пути вашей профессиональной самореализации вы можете столкнуться с ограниченностью местного рынка труда. Вы можете просто не найти работу!

Ограничения местного рынка труда

1 Низкие зарплаты

Даже если вы высококлассный специалист, на местном рынке может просто не оказаться того, кто может платить вам достойную зарплату. Пример: учителя, ученые.

2 Перепроизводство кадров

Количество юристов и экономистов, которые выпускают вузы, в десятки раз превосходит потребность рынка. 90% из них не могут найти работу по специальности. Часто это следствие низкого качества обучения.

3 Спрос на вашу профессию отсутствует

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

Когда физик с мировым именем бросает на родине кафедру и едет в Нью-Йорк мыть посуду – это трагедия. Когда физик с мировым именем моет на родине посуду, вместо того, чтобы возглавить кафедру в Нью-Йорке – это еще большая трагедия.

4 Небольшие карьерные перспективы

Вы биржевой брокер и хотите расти как узкий специалист по ценным бумагам. В будущем вы хотите возглавить собственный инвестиционный фонд. В вашей стране спрос на специалистов такого профиля может отсутствовать в принципе.

5 Маленький рынок труда

В стране всего может быть пара компаний, которым интересен специалист вашего профиля и квалификации. Если вы работайте в одной из них, вам могут запретить работать у конкурентов. Вам просто больше некуда устроиться.

Вследствие процессов глобализации, а также развития и удешевления телекоммуникационных технологий появился глобальный рынок труда. Он состоит из компаний, которые хотят (и могут) нанимать себе работников за рубежом. И работников, которые хотят (и могут) устраиваться на работу в иностранную компанию.

Преимущества глобального рынка труда

1 Зарплаты ниже, чем в развитых странах, но выше чем в развивающихся.

Если вы специалист, востребованный на глобальном рынке труда, то разница в доходах на местном и глобальном рынках может достигать 5-10 раз. При этом вы тратите заработанные деньги в своей стране, чем развиваете ее экономику.

2 Опыт. Более совершенные бизнес-процессы

Главное, что дает работа – это опыт, деньги и связи. Если вы привыкли брать только деньги – это ваши проблемы. Вы можете получить ценнейший опыт, если поработайте в ведущих мировых компаниях. Они приветствуют тенденции глобализации, так что это может быть легче, чем кажется. Как сотруднику компании вам будут видны все эффективные и не очень внутренние бизнес-процессы. Надо только держать открытыми глаза и уши.

3 Большие перспективы роста

Работа в большой международной компании поможет вам расти как профессионально, так и строить карьеру. Вы можете обзавестись полезными связями во всем мире, что очень полезно: зарекомендуйте себя отличным специалистом и вам, возможно, несколько международных компаний предложат продолжить у них карьеру. Талантливому человеку нужна только возможность, как ее использовать он додумается сам.

4 Командировки

Вам часто будут предлагать ездить заграницу в командировки. Особенно, если компания имеет несколько международных филиалов. Не стоит этим пренебрегать: это хорошая возможность не только попутешествовать, но и получить новые знания, навыки, поговорить с людьми. Помните, что одна-единственная точка зрения еще никогда не давала качественную объемную картину.

5 Возможность переехать в понравившуюся вам страну

Очень часто, зарекомендовав себя отличным специалистом, можно получить приглашение переехать/поработать в офисе заказчика. Это очень удобно. Вы, скорее всего, уже бывали там, в командировках, и представляете куда едете. Имеете там друзей и знакомых. Сразу получите хорошую работу и коллектив, который вас знает. Да это почти лучшие условия для иммиграции, которые я знаю.

Требования глобального рынка труда

1 Ваша профессия должна подходить для этого

Не все профессии можно перенести на глобальный рынок. Но многие можно. Их список постоянно расширяется. Их можно перечислять и перечислять: телефонная поддержка, разработка, исследования, дизайн, почти все, что касается интернета и/или компьютеров. Если ваша профессия появилась всего 20-30 лет назад, есть очень большая вероятность, что он легко глобализируется.

2 Цена и качество

Когда иностранная компания видит, что может нанять у вас в стране специалиста лучшего уровня и дешевле, чем у себя, зачастую ей трудно устоять. Вы должны быть или «лучше и дешевле» или «гораздо дешевле». Просто «дешевле» ее не устроит, т.к. компания несет дополнительные риски, когда нанимает специалистов удаленно.

3 Английский язык

В 21 веке английский язык - это международный язык. Хотите работать на глобальном рынке труда и пользоваться всеми его преимуществами, но английский не ваш родной – учите международный язык. Чем хуже вы знаете английский язык, тем сильнее должны быть ваши два остальных преимущества.



Получить высшее образование легко - поступил в вуз, 5 лет "проучился" и готово. Благо вузов сейчас как грязи.

Получить профессиональное образование сложнее - сначала надо найти место, где его можно получить, а потом надо много работать. JavaRush - дает отличный старт, чтобы стать профессионалом. Пройдешь JavaRush, устроишься на работу, а дальше будешь получать и опыт и деньги одновременно.

1. Объяснение основных коллекций

- Привет, Амиго. Сегодня хочу рассказать тебе о коллекциях. Коллекциями/контейнерами в Java принято называть классы, основная цель которых – хранить набор других элементов. Пример такого класса, с которым ты уже знаком, есть – это ArrayList.

- В Java коллекции делятся на три основных группы: Set - множество, List - список, Map - словарь (или карта).

- И в чем же их отличие?

- Начну с Set. Представь много туфель сброшенных в кучу – это Set - множество. В set можно добавить элемент, поискать его или удалить. Но у элементов там нет строго заданного порядка!

- Не густо…

- А теперь представь ту же кучу обуви, но выставленную вдоль стенки. Теперь в ней появился порядок. У каждого элемента есть его номер. И можно просто взять «пару номер 7» по её номеру. Это – List – список. Мы можем добавить элемент в начало списка или в середину, или убрать его, и сделать это просто по его номеру.

- Понятно. А Map?

- Представь ту же обувь, но теперь у каждой пары есть табличка с именем «Коля», «Вася», «Аня». Это Map – мэп, (его еще часто называют «карта» или «словарь»). У каждого элемента есть его уникальное название, по которому к нему можно было обращаться. Уникальное название элемента ещё называют «ключом». А Map – это набор пар «ключ»-«значение». Ключ не обязательно должен быть строкой, он может быть любым типом. Map, у которого тип ключа – Integer, – это фактически List (с некоторыми отличиями).

- На словах понятно, но хотелось бы увидеть больше примеров.

- Примеры тебе даст Риша, а я хочу добавить еще пару слов.

- Все коллекции и контейнеры сразу после создания ничего в себе не хранят. Но в них можно постепенно добавлять элементы – тогда они будут динамически изменять свой размер.

- О, это уже интересно. А как узнать, сколько элементов в коллекции?

- Для этого есть метод size(). В коллекциях есть все необходимое. Думаю, через пару уроков ты сам убедишься, какие эти коллекции удобные.

- Надеюсь.

2. Список всех коллекций и интерфейсов

- Привет, Амиго.

- Здорова, Риша.

- Элли мне сказала, что ты хотел больше примеров коллекций. Сейчас я дам тебе несколько. Хочу представить тебе список коллекций и интерфейсов:

ИнтерфейсКласс/РеализацияОписание
List ArrayList Список
LinkedList Список
Vector Вектор
Stack Стек
Set HashSet Множество
TreeSet Множество
SortedSet Отсортированное множество
Map HashMap Карта/Словарь
TreeMap Карта/Словарь
SortedMap Отсортированный словарь
Hashtable Хеш-таблица

- Хм. Как их много. Четыре List’а, три Set’а и четыре Map’а.

- Да, это все различные реализации интерфейсов List, Set и Map.

- А чем отличаются различные реализации?

- Об этом как раз сегодня мы тебе и расскажем. Просто подожди немного.

- Может, у тебя уже накопились какие-нибудь вопросы?

- Как вывести список на экран я знаю. А как вывести Set и Map?

- У элементов списка (List) есть четко заданный порядок, поэтому их можно вывести просто по номеру. У Set и Map строго заданного порядка элементов нет. Собственно говоря, порядок их элементов может меняться при удалении или добавлении какого-нибудь элемента.

- Надо же.

- Поэтому для работы с элементами коллекций были придуманы специальные объекты – итераторы. С их помощью можно пройтись по всем элементам коллекции, даже если у них нет номера, а только имена (Map), или вообще нет имён – Set.

-Примеры:

Вывод на экран элементов Set
public static void main(String[] args)
{
    Set<String> set = new HashSet<String>();
    set.add("Mama");
    set.add("Mila");
    set.add("Ramu");

    //получение итератора для множества
    Iterator<String> iterator = set.iterator();

    while (iterator.hasNext())        //проверка, есть ли ещё элементы   
    {
        //получение текущего элемента и переход на следующий
        String text = iterator.next();

        System.out.println(text);
    }
}
Вывод на экран элементов List
public static void main(String[] args)
{
    List<String> list = new ArrayList<String>();
    list.add("Mama");
    list.add("Mila");
    list.add("Ramu");

    Iterator<String> iterator = list.iterator();//получение итератора для списка

    while (iterator.hasNext())      //проверка, есть ли ещё элементы   
    {
        //получение текущего элемента и переход на следующий
        String text = iterator.next();

        System.out.println(text);
    }
}
Вывод на экран элементов Map
public static void main(String[] args)
{
    //все элементы хранятся в парах
    Map<String, String> map = new HashMap<String, String>();
    map.put("first", "Mama");
    map.put("second", "Mila");
    map.put("third", "Ramu");

    Iterator<Map.Entry<String, String>> iterator = map.entrySet().iterator();

    while (iterator.hasNext())
    {
        //получение «пары» элементов
        Map.Entry<String, String> pair = iterator.next();
        String key = pair.getKey();            //ключ
        String value = pair.getValue();        //значение
        System.out.println(key + ":" + value);
    }
}

- Ничего себе! И что все это значит?

- На самом деле все довольно просто. Сначала мы получаем у коллекции специальный объект-iterator. У него есть всего два метода

1 Метод next() возвращает очередной элемент коллекции.

2 Метод hasNext() проверяет, есть ли еще элементы, которые не возвращал next().

- Ага. Похоже ситуация начинает проясняться. Давай я расскажу, как я все это понял.

- Так. Сначала надо вызвать у коллекции метод iterator(), чтобы получить этот волшебный объект-итератор.

- Затем мы в цикле, пока есть еще неполученные элементы, получаем их по одному. Получаем мы очередной элемент коллекции с помощью вызова next(), а проверяем, есть ли еще элементы в итераторе с помощью hasNext(). Все верно?

- Да, примерно все так и есть. Но самое интересное будет сейчас.

- В Java есть сокращённая запись работы с итераторами. По аналогии с while, for был добавлен еще один специальный оператор «for each» - «для каждого». Обозначается тоже ключевым словом for.

- Оператор for-each используется только при работе с коллекциями и контейнерами. В нем неявно используется итератор, но мы видим уже полученный элемент.

- Давая я покажу тебе длинную и сокращенную работу с итератором:

Длинная записьСокращенная запись
public static void main(String[] args)
{
  Set<String> set = new HashSet<String>();
  set.add("Mama");
  set.add("Mila");
  set.add("Ramu");

  Iterator<String> iterator = set.iterator();
  while (iterator.hasNext())
  {
    String text = iterator.next();
    System.out.println(text);
  }
}
public static void main(String[] args)
{
    Set<String> set = new HashSet<String>();
    set.add("Mama");
    set.add("Mila");
    set.add("Ramu");

    for (String text : set)   
    {
        System.out.println(text);
    }
}

- Обрати внимание: в правой таблице нет ни зелёных, ни красных слов. Фактически 3 строки заменяются на одну:

Длинная записьСокращенная запись
Iterator<String> iterator = set.iterator();
while (iterator.hasNext())
{
    String text = iterator.next();
for (String text : set)

- Выглядит шикарно. Так мне нравится гораздо больше!

- Давай посмотрим на те же примеры, что и выше, только записанные короче:

Вывод на экран элементов Set
public static void main(String[] args)
{
    Set<String> set = new HashSet<String>();
    set.add("Mama");
    set.add("Mila");
    set.add("Ramu");

    for (String text : set)   
    {
        System.out.println(text);
    }
}
Вывод на экран элементов List
public static void main(String[] args)
{
    List<String> list = new ArrayList<String>();
    list.add("Mama");
    list.add("Mila");
    list.add("Ramu");

    for (String text : list)        
    {
        System.out.println(text);
    }
}
Вывод на экран элементов Map
public static void main(String[] args)
{
    Map<String, String> map = new HashMap<String, String>(); 
    map.put("first", "Mama");
    map.put("second", "Mila");
    map.put("third", "Ramu");

    for (Map.Entry<String, String> pair : map.entrySet())
    {
        String key = pair.getKey();                      //ключ
        String value = pair.getValue();                  //значение
        System.out.println(key + ":" + value);
    }
}

- Так это же другое дело!

- Рад, что тебе понравилось.

3. Задачи по коллекциям

- Привет, Амиго. Хочу дать тебе несколько задач по коллекциям:

Задачи
1. HashSet из растений

Создать коллекцию HashSet с типом элементов String.
Добавить в неё 10 строк: арбуз, банан, вишня, груша, дыня, ежевика, жень-шень, земляника, ирис, картофель.
Вывести содержимое коллекции на экран, каждый элемент с новой строки.
Посмотреть, как изменился порядок добавленных элементов.
2. HashMap из 10 пар

Создать коллекцию HashMap<String, String>, занести туда 10 пар строк: арбуз – ягода, банан – трава, вишня – ягода, груша – фрукт, дыня – овощ, ежевика – куст, жень-шень – корень, земляника – ягода, ирис – цветок, картофель – клубень.
Вывести содержимое коллекции на экран, каждый элемент с новой строки.

Пример вывода (тут показана только одна строка):
картофель – клубень
3. Коллекция HashMap из котов

Есть класс Cat, с полем имя (name, String).
Создать коллекцию HashMap<String, Cat>.
Добавить в коллекцию 10 котов, в качестве ключа использовать имя кота.
Вывести результат на экран, каждый элемент с новой строки.
4. Вывести на экран список ключей

Есть коллекция HashMap<String, String>, туда занесли 10 различных строк.
Вывести на экран список ключей, каждый элемент с новой строки.
5. Вывести на экран список значений

Есть коллекция HashMap<String, String>, туда занесли 10 различных строк.
Вывести на экран список значений, каждый элемент с новой строки.
6. Коллекция HashMap из Object

Есть коллекция HashMap<String, Object>, туда занесли 10 различных пар объектов.
Вывести содержимое коллекции на экран, каждый элемент с новой строки.

Пример вывода (тут показана только одна строка):
Sim - 5

4. Знакомимся с типом Date

- Привет, Амиго. Хочу рассказать тебе про интересный тип – Date. С помощью этого типа можно хранить дату и время, а также измерять временные промежутки.

- Уже интересно. Продолжай.

- Каждый объект типа Date хранит внутри себя время. А время хранится в очень интересном виде – количество миллисекунд, которые прошли с 1 января 1970 года, по Гринвичу.

- Ничего себе!

- Ага. Это число настолько большое, что не влезает в int, приходится хранить его в long. Зато очень удобно считать разницу между двумя датами: отнял два числа и уже известна разница с точностью до миллисекунд. И к тому же устраняется проблема смены дат и перевода часов.

- А что самое интересное, каждый объект при создании инициализируется текущем временем. Чтобы узнать текущее время – достаточно просто создать объект.

- А как с ним работать?

- Вот тебе несколько примеров:

Получение текущей даты:
public static void main(String[] args) throws Exception
{
    Date today = new Date();
    System.out.println("Current date: " + today);
}
Вычисление разницы между двумя датами:
public static void main(String[] args) throws Exception
{
    Date currentTime = new Date();           //получаем текущую дату и время
    Thread.sleep(3000);                      //ждём 3 секунды – 3000 миллисекунд
    Date newTime = new Date();               //получаем новое текущее время
        
    long msDelay = newTime.getTime() - currentTime.getTime(); //вычисляем разницу
    System.out.println("Time distance is: " + msDelay + " in ms");
}
Наступило ли уже некоторое время:
public static void main(String[] args) throws Exception
{
    Date startTime = new Date();

    long endTime = startTime.getTime() + 5000;   //    +5 секунд
    Date endDate = new Date(endTime);

    Thread.sleep(3000);              // ждем 3 секунды 

    Date currentTime = new Date();
    if (currentTime.after(endDate))//проверяем что время currentTime после endDate
    {
        System.out.println("End time!");
    }
}
Сколько прошло времени с начала сегодняшнего дня:
public static void main(String[] args) throws Exception
{
    Date currentTime = new Date();
    int hours = currentTime.getHours();
    int mins = currentTime.getMinutes();
    int secs = currentTime.getSeconds();

    System.out.println("Time from midnight " + hours + ":" + mins + ":" + secs);
}
Сколько дней прошло с начала года:
public static void main(String[] args) throws Exception
{
    Date yearStartTime = new Date();
    yearStartTime.setHours(0);
    yearStartTime.setMinutes(0);
    yearStartTime.setSeconds(0);

    yearStartTime.setDate(1);      // первое число
    yearStartTime.setMonth(0);     // месяц январь, нумерация для месяцев 0-11

    Date currentTime = new Date();
    long msTimeDistance = currentTime.getTime() - yearStartTime.getTime();
    long msDay = 24 * 60 * 60 * 1000;  //сколько миллисекунд в одних сутках
        
    int dayCount = (int) (msTimeDistance/msDay); //количество целых дней
    System.out.println("Days from start of year: " + dayCount);
}

- Метод getTime() возвращает количество миллисекунд, которое хранится в объекте Date.

- Метод after() проверяет, что дата, у которой мы вызвали метод, идет после переданной в метод даты after.

- Методы getHours(), getMinutes(), getSeconds() возвращают количество часов, минут и секунд у объекта, у которого их вызвали.

- Более того, в последнем примере ты видишь, что можно повлиять на дату/время, сохраненное в объекте Date. Мы получаем текущее время и дату, а затем сбрасываем часы, минуты и секунды в 0. Так же устанавливаем месяц в Январь, а день месяца в 1. Теперь объект yearStartTime хранит дату и время 1 января текущего года 0 часов 0 минут 0 секунд.

- Потом мы снова получаем текущую дату currentTime, и вычисляем разницу в миллисекундах между двумя датами. Я про msTimeDistance.

- Затем делим msTimeDistance на количество миллисекунд в сутках и получаем полное количество дней, прошедшее с начала года до сегодняшнего дня!

- Вау! Вот это круто!

5. ArrayList vs. LinkedList

- Как насчёт немного размять мозги? Надеюсь, они ещё не закипели.

- В таблице контейнеров и коллекций ты ранее видел, что у одного и того же интерфейса может быть несколько реализаций. Сейчас я расскажу тебе, зачем это нужно. И в чем отличие ArrayList от LinkedList.

- Все дело в том, что коллекции могут быть реализованы разными способами и нет единственного – самого правильного. При одном подходе одни операции являются быстрыми, а остальные медленными, при другом – все наоборот. Нет одного идеального, подходящего всем решения.

- Поэтому было решено сделать несколько реализаций одной и той же коллекции. И каждая реализация была оптимизирована для какого-то узкого набора операций. Так появились разные коллекции. Давай рассмотрим это на примере двух классов – ArrayList и LinkedList.

- ArrayList реализован внутри в виде обычного массива. Поэтому при вставке элемента в середину, приходиться сначала сдвигать на один все элементы после него, а уже затем в освободившееся место вставлять новый элемент. Зато в нем быстро реализованы взятие и изменение элемента – операции get, set, так как в них мы просто обращаемся к соответствующему элементу массива.

- LinkedList реализован внутри по-другому. Он реализован в виде связного списка: набора отдельных элементов, каждый из которых хранит ссылку на следующий и предыдущий элементы. Чтобы вставить элемент в середину такого списка, достаточно поменять ссылки его будущих соседей. А вот чтобы получить элемент с номером 130, нужно пройтись последовательно по всем объектам от 0 до 130. Другими словами операции set и get тут реализованы очень медленно. Посмотри на таблицу:

ОписаниеОперацияArrayListLinkedList
Взятие элемента get Быстро Медленно
Присваивание элемента set Быстро Медленно
Добавление элемента add Быстро Быстро
Вставка элемента add(i, value) Медленно Быстро
Удаление элемента remove Медленно Быстро

- Ага. Кое-что начинает проясняться. А есть какие-нибудь критерии или правила, когда какая коллекция лучше?

- Ну, для простоты, я бы сформулировал такое правило: если ты собираешься вставлять (или удалять) в середину коллекции много элементов, то тебе лучше использовать LinkedList. Во всех остальных случаях – ArrayList.

- Как они устроены мы разберем в старших уровнях, а пока будем учиться ими пользоваться.

6. Задача: померить производительность обоих списков

- А вот и ты. Я уже начал скучать. Где это ты пропадал? Вот тебе задачи.

- Интересные?

- Ну конечно! Очень интересные:

Очень интересные задачи
1. Создать два списка LinkedList & ArrayList.

Нужно создать два списка – LinkedList и ArrayList.
2. Провести 10 тысяч вставок, удалений

Для arrayList и linkedList провести 10 тысяч вставок, удалений, а также вызовов get и set.
3. Измерить сколько времени занимает 10 тысяч вставок для каждого списка

Измерить, сколько времени занимает 10 тысяч вставок для каждого списка.
Метод getTimeMsOfInsert должен вернуть время его исполнения в миллисекундах.
4. Измерить сколько времени занимает 10 тысяч вызовов get для каждого списка

Измерить, сколько времени занимает 10 тысяч вызовов get для каждого списка.
Метод getTimeMsOfGet должен вернуть время его исполнения в миллисекундах.
5. Четыре метода

Реализовать 4 метода. Они должны возвращать список, который лучше всего подходит для выполнения данных операций (быстрее всего справится с большим количеством операций). Ничего измерять не нужно.

7. Set, Map, что можно с ними делать

- Ты ещё не устал? Тогда продолжим. Хочу поподробнее рассказать тебе, что такое Set и Map. И какие у них есть операции.

- Set – это множество – куча ненумерованных объектов. Главная особенность Set – в нем только уникальные объекты, т.е. они все разные. Вот что с ним можно делать:

ОперацияМетод
Добавлять элемент(ы)add(), addAll()
Удалять элемент(ы)remove(), removeAll()
Проверять, есть ли элемент(ы) contains(), containsAll()

- И это все?

- Собственно говоря, да. Ещё можно узнать количество элементов с помощью метода size().

- А что насчёт Map?

- Map – это множество пар. То же множество, но не одиноких элементов, а пар: ключ-значение. Единственное ограничение: первый объект в паре, называемый ключом, должен быть уникальным. В Map не может содержаться две пары с одинаковыми ключами.

- Вот что мы можем делать с Map:

ОперацияМетод
Получить множество всех парentrySet()
Получить множество всех ключей keySet()
Получить множество всех значенийvalues()
Добавить паруput(key, value)
Получить значение по ключуget(key)
Проверить наличие «ключа»containsKey(key)
Проверить наличие «значения»containsValue(value)
Проверить что Map - пустойisEmpty()
Очистить Mapclear()
Удалить элемент по ключуremove(key)

- Вот это гораздо интереснее, чем set.

- Да, Map хоть не так популярен, как список, но используется во многих задачах.

8. Задачи на Set & Map

- Ты уже выучил, что такое Set и Map, я надеюсь? Вот тебе немного задач на Set и Map.

Задачи на коллекции
1. 20 слов на букву «Л»

Создать множество строк (Set<String>), занести в него 20 слов на букву «Л».
2. Удалить все числа больше 10

Создать множество чисел(Set<Integer>), занести туда 20 различных чисел.
Удалить из множества все числа больше 10.
3. Одинаковые имя и фамилия

Создать словарь (Map<String, String>) занести в него десять записей по принципу «Фамилия» - «Имя». Проверить сколько людей имеют совпадающие с заданным имя или фамилию.
4. Удалить всех людей, родившихся летом

Создать словарь (Map<String, Date>) и занести в него десять записей по принципу: «фамилия» - «дата рождения». Удалить из словаря всех людей, родившихся летом.
5. Удалить людей, имеющих одинаковые имена

Создать словарь (Map<String, String>) занести в него десять записей по принципу «фамилия» - «имя». Удалить людей, имеющих одинаковые имена.

9. Лекция по коллекциям

- Хо-хо. Наконец-то мы дошли до коллекций. У меня сохранилась “замечательная” лекция с моих студенческих времён. Немного слишком пыльная, конечно, но “отличная” по своей сути. Вот мои заметки:

Дополнительная информация для 8-го уровня

10. Хулио

- О, Господи! Ты опять перетрудился! Говорил же тебе – не работай так много. Давай я поставлю что-нибудь расслабляющее:

Оригинал видео на YouTube

11. Задания на дом

- Здорово, боец!

- Здравия желаю, капитан Бобров!

- У меня для тебя шикарная новость. Вот тебе задания для закрепления полученных навыков. Выполняй их каждый день, и твои навыки будут расти с неимоверной скоростью. Они специально разработаны для выполнения их в Intellij IDEA.

Дополнительные задания для выполнения в Intellij Idea
1. Set из котов

1. Внутри класса Solution создать public static класс кот – Cat.
2. Реализовать метод createCats, он должен создавать множество (Set) котов и добавлять в него три кота.
3. В методе main удалите одного кота из Set cats.
4. Реализовать метод printCats, он должен вывести на экран всех котов, которые остались во множестве. Каждый кот с новой строки.
2. Множество всех животных

1. Внутри класса Solution создать public static классы Cat, Dog.
2. Реализовать метод createCats, который должен возвращать множество с 4 котами.
3. Реализовать метод createDogs, который должен возвращать множество с 3 собаками.
4. Реализовать метод join, который должен возвращать объединенное множество всех животных - всех котов и собак.
5. Реализовать метод removeCats, который должен удалять из множества pets всех котов, которые есть в множестве cats.
6. Реализовать метод printPets, который должен выводить на экран всех животных, которые в нем есть. Каждое животное с новой строки
3. Люди с одинаковыми именами и/или фамилиями

1. Создать словарь Map (<String, String>) и добавить туда 10 человек в виде «Фамилия»-«Имя». 2. Пусть среди этих 10 человек есть люди с одинаковыми именами и/или фамилиями.
2. Пусть среди этих 10 человек есть люди с одинаковыми именами.
3. Пусть среди этих 10 человек есть люди с одинаковыми фамилиями.
4. Вывести содержимое Map на экран.
4. Минимальное из N чисел

1. Ввести с клавиатуры число N.
2. Считать N целых чисел и заполнить ими список - метод getIntegerList.
3. Найти минимальное число среди элементов списка - метод getMinimum.
5. Мама Мыла Раму. Теперь с большой буквы

Написать программу, которая вводит с клавиатуры строку текста.
Программа заменяет в тексте первые буквы всех слов на заглавные.
Вывести результат на экран.

Пример ввода:
мама мыла раму.
Пример вывода:
Мама Мыла Раму.
6. Вся семья в сборе

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

Переставь один модификатор static, чтобы пример скомпилировался.
8. Пять наибольших чисел

Создать массив на 20 чисел. Заполнить его числами с клавиатуры. Вывести пять наибольших чисел.
9. Работа с датой

1. Реализовать метод isDateOdd(String date) так, чтобы он возвращал true, если количество дней с начала года - нечетное число, иначе false
2. String date передается в формате MAY 1 2013
Не забудьте учесть первый день года.

JANUARY 1 2000 = true
JANUARY 2 2020 = false

- Те задания были для духов. Для дедушек я добавил бонусные задания повышенной сложности. Только для старослужащих.

Бонусные задачи
1. Номер месяца

Программа вводит с клавиатуры имя месяца и выводит его номер на экран в виде: «May is 5 month». Используйте коллекции.
2. Нужно добавить в программу новую функциональность.

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

Пример ввода:
Москва
Ивановы
Киев
Петровы
Лондон
Абрамовичи
Лондон

Пример вывода:
Абрамовичи
3. Задача по алгоритмам.
Задача: Введи с клавиатуры 20 слов и выведи их в алфавитном порядке.