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

Уровень 7

Информационные технологии

Начавшаяся в конце 20 века компьютерная революция привела в середине 90-х годов к созданию интернета (веба). И это было началом еще большей революции. Эффект от появления интернета сопоставим с эффектом индустриализации. Но самое вкусное в том, что этот процесс еще находится в самом начале.

Новый мир

Количество сайтов превышает 200 миллионов. Пользователей интернета – 3 миллиарда. Интернет-аукционы, интернет-сайты, интернет-магазины, интернет-услуги. ИТ-экономика растет на 20%-30% ежегодно. Это чудовищные темпы. Но они все не падают и не падают.

За последние 10 лет в Силиконовой Долине (центр ИТ-мира), каждые 2 месяца основывалась компания, впоследствии стоящая миллиард долларов. И это не говоря уже о таких звездах интернета, как Facebook ($220 миллиардов), Amazon ($140 миллиардов) и Google ($350 миллиардов). Все эти компании не появились бы, если бы не было интернета.

Все это приводит к высокому спросу на ИТ-специалистов. Мировой ИТ-экономике требуются: программисты, дизайнеры, тестировщики, архитекторы, менеджера, системные администраторы и другие специалисты.

Хорошо быть айтишником

Если вы ИТ-специалист, то для вас настало золотое время. Вы можете работать на западную компанию, а жить – в небольшом городе или вообще в другой стране. Доходы будут, конечно, меньше чем на западе (обычно раза в два), но выше, чем на местном рынке труда (в 3-10 раз). Чем меньше ваш город, тем заметней разница.

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

Прилив поднимает все лодки. Но почему бы вам не оказаться той лодкой, которая находится в нужное время и в нужном месте? Это тоже надо уметь.

Перспективы иммиграции

На западе ИТ-специалисты входят в тройку самых высокооплачиваемых профессий наряду с врачами и юристами. Средние зарплаты программистов около $90 тысяч/год. Но самое интересное в том, что ИТ-профессии отлично подходят для глобального рынка труда.

Что будет, если врач захочет сменить страну? Другая страна – другие медицинские стандарты. С дипломом его страны работать в новой скорее всего не дадут. Придется выучить язык, заново сдать экзамены, пройти практику – долгий путь.

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

ИТ-специалисты. Очень часто напрямую или через посредников работают на крупные западные компании. Те же технологии, те же бизнес-процессы. Вся документация в интернете на английском. Резюме – на английском. Можно переехать в любую страну мира и ничего не поменяется. Даже заказчики/работодатели часто одни и те же.

А зарплаты айтишников в Калифорнии ох как хороши. Вот зачем нужно все время развиваться.



Лучший способ мотивировать себя что-то учить - это заплатить за это деньги. Жадность банально сильнее лени.

1. Массивы, null

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

- День добрый, Элли!

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

- Начну с аналогии. Давай сравним обычный жилой дом и многоэтажку. В обычном доме чаще всего живет одна семья, а многоэтажка разбита на квартиры. Чтобы написать письмо семье, которая живет в обычном доме, надо указать его уникальный адрес. А чтобы написать письмо семье, которая живет в квартире, надо указать уникальный адрес дома и еще номер квартиры.

- Да, тут все понятно.

- Так вот, переменная-массив – это переменная-многоэтажка. В ней можно хранить не одно значение, а несколько. В такой переменной есть несколько квартир (ячеек), к каждой из которых можно обратиться по ее номеру (индексу). Для этого после имени переменной в квадратных скобках надо указать индекс ячейки, к которой обращаемся. Это довольно просто.

- Надеюсь.

- Переменная-многоэтажка (переменная-массив) может быть любого типа, надо лишь вместо «TypeName имя_переменной», написать «TypeName[] имя_переменной».

- Примеры:

Код Пояснение
String[] list = new String[5]; Создание массива на 5 элементов типа «строка»
System.out.println(list[0]);
System.out.println(list[1]);
System.out.println(list[2]);
System.out.println(list[3]);
System.out.println(list[4]);
На экран будет выведено пять значений “null”.

Чтобы получить значение, которое хранится в определенной ячейке массива, используйте квадратные скобки и номер ячейки
int listCount = list.length; listCount получит значение 5 – количество ячеек в массиве list.
list.length хранит длинну(количество ячеек) массива.
list[1] = "Mama";
String s = list[1];
При присваивании объектов ячейкам массива нужно указывать индекс/номер ячейки в квадратных скобках.
for (int i = 0; i < list.length; i++)
{
     System.out.println(list[i]);
}
Вывод всех значений массива на экран.

- Как интересно.

- Переменная-массив требует дополнительной инициализации.

- ?

- Обычную переменную нужно было просто объявить и уже можно присваивать ей различные значения. С массивом все немного сложнее.

- Сначала надо создать контейнер на N элементов, а затем в него уже можно класть значения.

Код Пояснение
String[] list = null; Переменная-массив list, ее значение – null. Она может хранить только контейнер для элементов. Контейнер надо создавать отдельно.
String[] list = new String[5]; Мы создаем контейнер на 5 элементов и кладем ссылку на него в переменную list. Этот контейнер содержит 5 квартир (ячеек) с номерами 0, 1, 2, 3, 4.
String[] list = new String[1]; Мы создаем контейнер на 1 элемент и кладем ссылку на него в переменную list. Чтобы занести что-то в этот контейнер надо написать list[0] = “Yo!”;
String[] list = new String[0]; Мы создаем контейнер на 0 элементов и кладем ссылку на него в переменную list. Ничего в этот контейнер занести нельзя!

- Ага. Кое-что проясняется.

- Основные факты о массивах:

1) Массив состоит из множества ячеек.

2) Доступ к конкретной ячейке идёт через указание её номера.

3) Все ячейки одного типа.

4) Начальное значение для всех ячеек – null, для примитивных типов – 0, 0.0 (для дробных), false (для типа boolean). Точно такое же, как и у простых неинициализированных переменных.

5) String[] list - это просто объявление переменной. Сначала нужно создать массив (контейнер) и положить его в эту переменную, а потом уже им пользоваться. См. пример ниже.

6) Когда мы создаём объект массив (контейнер), нужно указать, какой он длины – сколько в нем ячеек. Это делается командой вида: new TypeName[n];

- Примеры:

Код Пояснение
String s;
String[] list;
s равно null
list равно null
list = new String[10];
int n = list.length;
Переменная list хранит ссылку на объект - массив строк из 10 элементов.
n равно 10
list = new String[0]; Теперь list содержит массив из 0 элементов. Массив есть, но хранить элементы он не может.
list = null;
System.out.println(list[1]);
Будет сгенерировано исключение (ошибка программы) – программа аварийно завершится. list содержит пустую ссылку – null
list = new String[10];
System.out.println(list[11]);
Будет сгенерировано исключение (ошибка программы) – выход за границы массива.

Если list содержит 10 элементов/ячеек, то их разрешённые индексы: 0,1,2,3,4,5,6,7,8,9 – всего 10 штук.

2. Особенность устройства массивов в памяти

- Привет, Амиго! Давай я покажу тебе, как это все работает в памяти:

- А что это ещё за 345?

- Вообще-то я взял его с потолка, но, по идее, это адрес строки, содержащей слово «Мама».

- С массивами все немного сложнее:

- 155,166,177 – это тоже взятые с потолка числа, символизирующие адреса строк справа?

- Ага. Хорошо, что ты сам догадался. Обрати внимание, тут присутствует дополнительный объект – массив из 10 ячеек.

- Все ясно и понятно, спасибо. Действительно, лучше один раз увидеть. Спасибо, Риша.

3. Примеры использования массивов Array

- Хочу дать тебе несколько примеров, что интересного можно делать с массивами:

Пример 1.

Заполнение массива из 10 чисел, числами от 1 до 10:
public class MainClass
{
    public static void main(String[] args) 
    {
        int[] numbers = new int[10];

        for (int i = 0; i < numbers.length; i++)
        {
           numbers[i] = i + 1;
        }
    }
}
Заполнение массива из 10 чисел, числами от 10 до 1:
public class MainClass
{
    public static void main(String[] args) 
    {
        int[] numbers = new int[10];

        for (int i = 0; i < numbers.length; i++)
        {
           numbers[i] = 10 - i;
        }
    }
}
Заполнение массива из 10 чисел, числами от 0 до 9:
public class MainClass
{
    public static void main(String[] args) 
    {
        int[] numbers = new int[10];

        for (int i = 0; i < numbers.length; i++)
        {
           numbers[i] = i;
        }
    }
}
Заполнение массива из 10 чисел, числами от 9 до 0:
public class MainClass
{
    public static void main(String[] args) 
    {
        int[] numbers = new int[10];

        for (int i = 0; i < numbers.length; i++)
        {
           numbers[i] = 9 - i;
        }
    }
}

Пример 2.

Ввод 10 строк с клавиатуры
public class MainClass
{
  public static void main(String[] args) throws IOException
  {
    BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
    String[] list = new String[10];

    for (int i = 0; i < list.length; i++)
    {
      list[i] = reader.readLine();
     }
  }
}
Ввод 10 чисел с клавиатуры
public class MainClass
{
  public static void main(String[] args) throws IOException
  {
    BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
    int[] list = new int[10];

    for (int i = 0; i < list.length; i++)
    {
      String s = reader.readLine();
      list[i] = Integer.parseInt(s);
    }
  }
}

Пример 3.

Вывод массива на экран
public class MainClass
{
    public static void main(String[] args) throws IOException
    {
        int[] list = new int[10];

        //заполнение массива
        for (int i = 0; i < list.length; i++) 
           list[i] = i;

        //вывод на экран
        for (int i = 0; i < list.length; i++)  
          System.out.println(list[i]);
    }
}

Пример 4.

Быстрая (статическая) инициализация. Сумма элементов массива:
public class MainClass
{
    public static void main(String[] args) throws IOException
    {
        //это статическая инициализация
        int[] list = {5, 6, 7, 8, 1, 2, 5, -7, -9, 2, 0};        
        
        //подсчёт суммы элементов
        int sum = 0;
        for (int i = 0; i < list.length; i++) 
           sum += list[i];

        System.out.println("Sum is " + sum);
    }
}

Пример 5.

Поиск минимального элемента в массиве:
public class MainClass
{
    public static void main(String[] args) throws IOException
    {
        int[] list = {5, 6, 7, 8, 1, 2, 5, -7, -9, 2, 0};

        int min = list[0];
        for (int i = 1; i < list.length; i++)
        {
             if (list[i] < min) 
                  min = list[i];
        }

       System.out.println ("Min is " + min);
    }
}

4. Задачи на создание и использование массивов

- Привет, Амиго! Вот тебе пара задачек, дружище:

Задачи
1. Максимальное среди массива на 20 чисел

1. В методе initializeArray():
1.1. Создайте массив на 20 чисел
1.2. Считайте с консоли 20 чисел и заполните ими массив
2. Метод max(int[] array) должен находить максимальное число из элементов массива
2. Массив из строчек в обратном порядке

1. Создать массив на 10 строчек.
2. Ввести с клавиатуры 8 строчек и сохранить их в массив.
3. Вывести содержимое всего массива (10 элементов) на экран в обратном порядке. Каждый элемент - с новой строки.
3. 2 массива

1. Создать массив на 10 строк.
2. Создать массив на 10 чисел.
3. Ввести с клавиатуры 10 строк, заполнить ими массив строк.
4. В каждую ячейку массива чисел записать длину строки из массива строк, индекс/номер ячейки которой совпадает с текущим индексом из массива чисел. Вывести содержимое массива чисел на экран, каждое значение выводить с новой строки.
4. Массив из чисел в обратном порядке

1. Создать массив на 10 чисел.
2. Ввести с клавиатуры 10 чисел и записать их в массив.
3. Расположить элементы массива в обратном порядке.
4. Вывести результат на экран, каждое значение выводить с новой строки.
5. Один большой массив и два маленьких

1. Создать массив на 20 чисел.
2. Ввести в него значения с клавиатуры.
3. Создать два массива на 10 чисел каждый.
4. Скопировать большой массив в два маленьких: половину чисел в первый маленький, вторую половину во второй маленький.
5. Вывести второй маленький массив на экран, каждое значение выводить с новой строки.

5. ArrayList, отличие от Array

- А вот и я.

- Привет, Элли!

- Сегодня новая интересная тема! Сейчас я расскажу тебе о новом интересном классе – ArrayList.

- О, новый класс? Круто! И что он умеет делать?

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

- Единственным решением проблемы нехватки места в массиве было создание массива очень большого размера, чтобы все элементы туда точно поместились. Но это часто приводило к нерациональному расходу памяти. Если чаще всего в массиве хранилось три элемента, но был хотя бы мизерный шанс, что там их будет 100, приходилось создавать массив на 100 элементов.

- И что же придумали программисты?

- Они написали класс ArrayList, который выполнял ту же работу, что и Array (массив), но мог изменять свой размер.

- Интересный ход. И как же они это сделали?

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

ArrayArrayList
Создание контейнера элементов
String[] list = new String[10]; ArrayList<String> list = new ArrayList<String>();
Получение количества элементов
int n = list.length; int n = list.size();
Взятие элемента из массива/коллекции
String s = list[3]; String s = list.get(3);
Запись элемента в массив
list[3] = s; list.set(3, s);

- И в чем же преимущество ArrayList? Как по мне, так код стал длиннее.

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

- Во-вторых, изменение размера: когда нужно записать во внутренний массив ещё один элемент, а свободного места там нет, то внутри ArrayList делается вот что:

а) создаётся ещё один массив, вдвое большего размера.

б) все элементы из старого массива копируются в новый массив.

в) новый массив сохраняется во внутренней переменной объекта ArrayList, старый массив объявляется мусором (мы просто перестаём хранить на него ссылку).

ArrayArrayList
Добавление элемента в конец массива
Невозможно выполнить данное действие list.add(s);
Вставка элемента в середину массива
Невозможно выполнить данное действие list.add(15, s);
Вставка элемента в начало массива
Невозможно выполнить данное действие list.add(0, s);
Удаление элемента из массива
Можно стереть элемент с помощью list[3] = null. Но тогда останется «дыра» в массиве. list.remove(3);

- А как работать с этим ArrayList’ом?

- А практически так же, как и с массивом. Вот смотри. Давай сравним работу с ArrayList с работой с массивом. Для примера решим такую задачу «ввести 10 строк с клавиатуры и вывести их на экран в обратном порядке» .

- Смотри:

Используем ArrayИспользуем ArrayList
public static void main(String[] args)
{
Reader r = new InputStreamReader(System.in);
BufferedReader reader = new BufferedReader(r);

//ввод строк с клавиатуры
String[] list = new String[10];
for (int i = 0; i < list.length; i++)
{
  String s = reader.readLine();
  list[i] = s;
}

//вывод содержимого массива на экран
for (int i = 0; i < list.length; i++)
{
  int j = list.length - i - 1;
  System.out.println( list[j] );
}
}
public static void main(String[] args)
{
Reader r = new InputStreamReader(System.in);
BufferedReader reader = new BufferedReader(r);

//ввод строк с клавиатуры
ArrayList<String> list = new ArrayList<String>();
for (int i = 0; i < 10; i++)
{
  String s = reader.readLine();
  list.add(s);
}

//вывод содержимого коллекции на экран 
for (int i = 0; i < list.size(); i++)
{
  int j = list.size() - i - 1;
  System.out.println( list.get(j) );
}
}

- Я раскрасил одним цветом эквивалентные действия в обеих колонках.

- С одной стороны все по-другому, с другой – все осталось тем же самым.

- Ага. Только мы теперь не используем квадратные скобочки при работе с ArrayList. Вместо них мы используем методы get, set и add.

- Да, я уже заметил. Но все равно очень похоже.

6. Задачи по ArrayList

- Ты опять ничего не делаешь? Ты же робот! Роботы все время чем-то заняты. Вот тебе пара задачек, чтобы ты не расслаблялся. Но для начала – пара подсказок:

- Подсказка 1:

Список (анг. List), чаще всего под этим словом подразумевается ArrayList.

- Подсказка 2:

Строка (анг. String), под этим подразумевается тип String.

- Подсказка 3:

Создать список строк чаще всего означает: ArrayList<String> list = new ArrayList<String>();

Задачи
Задача 1. 5 различных строчек в списке

1. Создай список строк.
2. Добавь в него 5 различных строчек.
3. Выведи его размер на экран.
4. Используя цикл, выведи его содержимое на экран, каждое значение с новой строки.
Задача 2. Самая длинная строка

1. Создай список строк.
2. Считай с клавиатуры 5 строк и добавь в список.
3. Используя цикл, найди самую длинную строку в списке.
4. Выведи найденную строку на экран.
5. Если таких строк несколько, выведи каждую с новой строки.
Задача 3. Самая короткая строка

1. Создай список строк.
2. Считай с клавиатуры 5 строк и добавь в список.
3. Используя цикл, найди самую короткую строку в списке.
4. Выведи найденную строку на экран.
5. Если таких строк несколько, выведи каждую с новой строки.
Задача 4. 10 строчек в начало списка

1. Создай список строк в методе main.
2. Добавь в него 10 строчек с клавиатуры, но только добавлять не в конец списка, а в начало.
3. Используя цикл, выведи содержимое на экран, каждое значение с новой строки.
Задача 5. Удали последнюю строку и вставь её в начало

1. Создай список строк.
2. Добавь в него 5 строчек с клавиатуры.
3. Удали последнюю строку и вставь её в начало. Повторить 13 раз.
4. Используя цикл, выведи содержимое на экран, каждое значение с новой строки.

7. Generics

- И ещё одна крутая тема.

- Одни сюрпризы. Прямо не день, а день рождения.

- Сегодня я расскажу тебе, что такое Generics. “Дженерики” – это типы с параметром. В Java классы-контейнеры позволяют указывать тип их внутренних объектов.

- Когда мы объявляем generic-переменную, то мы указываем не один тип, а два: тип переменной и тип данных, которые она у себя хранит.

Хороший пример этого – ArrayList. Когда мы создаём новый объект/переменную типа ArrayList, нам удобно указать, значения какого типа будут храниться внутри этого списка.

КодПояснение
ArrayList<String> list = new ArrayList<String>(); Мы создали переменную list типа ArrayList.
Занесли в нее объект типа ArrayList.
В таком списке можно хранить только переменные типа String.
ArrayList list = new ArrayList(); Мы создали переменную list типа ArrayList.
Занесли в нее объект типа ArrayList.

В таком листе можно хранить переменные любого типа.
ArrayList<Integer> list = new ArrayList<Integer>(); Мы создали переменную list типа ArrayList.
Занесли в нее объект типа ArrayList.
В таком листе можно хранить только переменные типа Integer и int.

- Звучит очень интересно. Особенно про любой тип.

- Это только кажется, что это хорошо. На самом деле, если в одном методе в ArrayList кладутся строки, а в другом мы работаем с его содержимым и ожидаем, что там будут только числа, программа упадет (закроется с ошибкой).

- Ясно.

- Пока что мы не будем создавать свои классы с типами-параметрами, но будем использовать чужие.

- А в качестве типа-параметра можно поставить любой класс, даже тот, что напишу я?

- Да, любой тип, кроме примитивных типов. Все классы-параметры должны быть унаследованы от класса Object.

- Т.е. я не могу написать ArrayList<int> ?

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

Примитивный типКлассСписок
int Integer ArrayList<Integer>
double Double ArrayList<Double>
boolean Boolean ArrayList<Boolean>
char Character ArrayList<Character>
byte Byte ArrayList<Byte>

- Примитивные типы и их классы-аналоги (классы-обёртки) можно спокойно присваивать друг другу:

Примеры
int a = 5;
Integer b = a;
int c = b;
Character c = 'c'; //литерал 'c' имеет тип char
char d = c;
Byte b = (byte) 77; //литерал 77 имеет тип int
Boolean isOk = true; //литерал true имеет тип boolean
Double d = 1.0d; //литерал 1.0d имеет тип double

- Отлично. Тогда я думаю, я буду почаще использовать ArrayList.

8. Примеры по ArrayList и Generics

- Давай-ка я начну с действительно полезных вещей. Сейчас ты увидишь несколько полезных примеров работы с ArrayList и Generics:

- Пример 1:

Ввод списка целых чисел с клавиатуры
public static void main(String[] args) throws IOException
{
    BufferedReader reader = new BufferedReader(new InputStreamReader(System.in) );
    ArrayList<Integer> list = new ArrayList<Integer>();

    while (true)
    {
        String s = reader.readLine();
        if (s.isEmpty()) break;
        list.add(Integer.parseInt(s));
    }
}

- Пример 2:

То же, чётные числа добавляются в конец списка, нечётные – в начало.
public static void main(String[] args) throws IOException
{
    BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
    ArrayList<Integer> list = new ArrayList<Integer>();

    while (true)
    {
        String s = reader.readLine();
        if (s.isEmpty()) break;

        int x = Integer.parseInt(s);
        if (x % 2 == 0)  //проверяем, что остаток от деления на два равен нулю
            list.add(x);          //добавление в конец
        else
            list.add(0, x);      //вставка в начало      
    }
}

- Пример 3:

Удаление всех чисел больше 5:
public static void main(String[] args) throws IOException
{
    BufferedReader reader = new BufferedReader(new InputStreamReader(System.in) );
    ArrayList<Integer> list = new ArrayList<Integer>();

    list.add(1);
    list.add(7);
    list.add(11);
    list.add(3);
    list.add(15);

    for (int i = 0; i < list.size(); )  //убрали увеличение i внутрь цикла
    {
        if (list.get(i) > 5)
            list.remove(i);  //не увеличиваем i, если удалили текущий  элемент  
        else
            i++;
    }
}

- Пример 4:

Разделение массива на два – чётных и нечётных чисел
public static void main(String[] args) throws IOException
{
    //статическая инициализация массива
    int[] data = {1, 5, 6, 11, 3, 15, 7, 8};  

    //создание списка, где все элементы должны быть типа Integer 
    ArrayList<Integer> list = new ArrayList<Integer>();   

    //заполнение списка из массива
    for (int i = 0; i < data.length; i++) list.add(data[i]);  

    ArrayList<Integer> even = new ArrayList<Integer>();  //чётные
    ArrayList<Integer> odd = new ArrayList<Integer>();    //нечётные

    for (int i = 0; i < list.size(); i++)
    {
        Integer x = list.get(i);
        if (x % 2 == 0)    //если x - чётное
            even.add(x);   // добавляем x в коллекцию четных чисел  
        else
            odd.add(x);    // добавляем x в коллекцию нечетных чисел
    }
}

- Пример 5:

Слияние списков.
public static void main(String[] args) throws IOException
{
    ArrayList<Integer> list1 = new ArrayList<Integer>();   //создание списка  
    Collections.addAll(list1, 1, 5, 6, 11, 3, 15, 7, 8);   //заполнение списка

    ArrayList<Integer> list2 = new ArrayList<Integer>();
    Collections.addAll(list2, 1, 8, 6, 21, 53, 5, 67, 18);

    ArrayList<Integer> result = new ArrayList<Integer>();

    result.addAll(list1);   //добавление всех значений из одного списка в другой
    result.addAll(list2);

    for (Integer x : result)   //быстрый for по всем элементам, только для коллекций
    {
        System.out.println(x);
    }
}

- Круто. И что Диего даст мне сейчас кучу аналогичных задач, да?

- Ага!

9. Задачи по List<T>

- Наконец-то ты освободился. Устал уже держать в уме твои задачи. Вот тебе ещё парочка, чтобы не расслаблялся:

Задачи
1. Три массива

1. Введи с клавиатуры 20 чисел, сохрани их в список и рассортируй по трём другим спискам:
Число делится на 3 (x%3==0), делится на 2 (x%2==0) и все остальные.
Числа, которые делятся на 3 и на 2 одновременно, например 6, попадают в оба списка.
2. Метод printList должен выводить на экран все элементы списка с новой строки.
3. Используя метод printList, выведи эти три списка на экран. Сначала тот, который для x%3, потом тот, который для x%2, потом последний.
2. Слова в обратном порядке

Введи с клавиатуры 5 слов в список строк. Удали 3 - ий элемент списка, и выведи оставшиеся элементы в обратном порядке.
3. Слово «именно»

1. Создай список из слов «мама», «мыла», «раму».
2. После каждого слова вставь в список строку, содержащую слово «именно».
3. Используя цикл for, вывести результат на экран. Каждый элемент списка с новой строки.
4. Буква «р» и буква «л»

1. Создай список слов, заполни его самостоятельно.
2. Метод fix() должен:
2.1. удалять из списка строк все слова, содержащие букву «р»
2.2. удваивать все слова содержащие букву «л».
2.3. если слово содержит и букву «р» и букву «л», то оставить это слово без изменений.
2.4. с другими словами ничего не делать.

Пример:
роза
лира
лоза
Выходные данные:
лира
лоза
лоза
5. Удвой слова

1. Введи с клавиатуры 10 слов в список строк.
2. Метод doubleValues должен удваивать слова по принципу a,b,c → a,a,b,b,c,c.
3. Используя цикл for, выведи результат на экран, каждое значение с новой строки.

10. Лекция по массивам и спискам

- Я нашёл мои “замечательные” лекции! Так что сегодня ты станешь обладателем “ценнейшего знания” по массивам и спискам. Вот они:

Дополнительные материалы к уровню 7

11. Хулио

- Привет, Амиго! Рад, что ты со всем этим справился – ты заслужил награду:

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

12. Капитан

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

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

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

Дополнительные задания для выполнения в Intellij Idea
1. Вывести числа в обратном порядке

Ввести с клавиатуры 10 чисел и заполнить ими список.
Используя цикл for вывести их в обратном порядке.
2. Переставить M первых строк в конец списка

Ввести с клавиатуры 2 числа N и M
Ввести N строк и заполнить ими список.
Переставить M первых строк в конец списка.
Вывести список на экран, каждое значение с новой строки.
3. Максимальное и минимальное числа в массиве

Создать массив на 20 чисел.
Заполнить его числами с клавиатуры.
Найти максимальное и минимальное числа в массиве.
Вывести на экран максимальное и минимальное числа через пробел.
4. Вводить с клавиатуры строки, пока пользователь не введёт строку “end

Создать список строк.
Ввести строки с клавиатуры и добавить их в список.
Вводить с клавиатуры строки, пока пользователь не введёт строку “end”. “end” не учитывать.
Вывести строки на экран, каждую с новой строки.
5. Бум

Написать программу, которая ведёт обратный отсчёт с 30 до 0, и в конце выводит на экран текст «Бум!». Программа должна уменьшать число 10 раз в секунду. Для того чтобы вставить в программу задержку, воспользуйся функцией:
Thread.sleep(100); //задержка на одну десятую секунды.

Пример:
30
29

1
0
Бум!
6. Семья

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

Примечание:
Если написать свой метод String toString() в классе Human, то именно он будет использоваться при выводе объекта на экран.

Пример вывода:
Имя: Аня, пол: женский, возраст: 21, отец: Павел, мать: Катя
Имя: Катя, пол: женский, возраст: 55
Имя: Игорь, пол: мужской, возраст: 2, отец: Михаил, мать: Аня
7. Переставь один модификатор static

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

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

Дополнительные задания для выполнения в Intellij Idea
1. Нужно исправить программу, чтобы компилировалась и работала.

Задача: Программа вводит с клавиатуры данные про котов и выводит их на экран.

Пример:
Cat name is Barsik, age is 6, weight is 5, tail = 22
Cat name is Murka, age is 8, weight is 7, tail = 20
2. Нужно добавить в программу новую функциональность.

Задача: Программа вводит строки, пока пользователь не введёт пустую строку (нажав enter). Потом она конвертирует строки в верхний регистр (Мама превращается в МАМА) и выводит их на экран.
Новая задача: Программа вводит строки, пока пользователь не введёт пустую строку (нажав enter). Потом программа строит новый список. Если в строке чётное число букв, строка удваивается, если нечётное – утраивается. Программа выводит содержимое нового списка на экран.

Пример ввода:
Кот
Коты
Я
Пример вывода:
Кот Кот Кот
Коты Коты
Я Я Я
3. Задача по алгоритмам.

Задача: Программа вводит с клавиатуры 20 чисел и выводит их в убывающем порядке.