diff --git a/README.md b/README.md new file mode 100644 index 0000000..24a6fc8 --- /dev/null +++ b/README.md @@ -0,0 +1,26 @@ +# Домашние задания по курсу «Основы Java» + +### [Словарь терминов Java](./java_glossary.md/) + +### Блок 3. Основы ООП + +3.1 Модификаторы доступа, наследование (квиз) + +[3.2 Полиморфизм](polymorphism) + +[3.3 Абстракции и интерфейсы](abstractions-interfaces) + +[3.4 Исключения, Stacktrace](exceptions) + + +### Блок 4. InMemory хранение данных — коллекции + +4.1 Generics в коллекциях и методах (квиз) + +[4.2 Коллекции List](list) + +[4.3 Коллекции Queue](queue) + +[4.4 Коллекция HashMap и HashSet](hash-collections) + +[4.5 Коллекции Treemap и TreeSet](tree-collections) diff --git a/abstractions-interfaces/3.3.1/README.md b/abstractions-interfaces/3.3.1/README.md new file mode 100644 index 0000000..bc38dbe --- /dev/null +++ b/abstractions-interfaces/3.3.1/README.md @@ -0,0 +1,33 @@ +## Задача 1. Библиотека + +### Описание +Необходимо разработать иерархию работников библиотеки. Нужно реализовать совмещение нескольких ролей в библиотеке в одном исполнителе через интерфейсы. Каждый объект в программе имеет определенный набор действий. + +Часто программист, создающий объект, не представляет все ситуации, в которых тот будет использоваться. +Также программисту, использующему объект, часто неизвестны все его детали. + +Для передачи информации о том, что должен уметь объект, используются интерфейсы. + +Примером интерфейсов в нашей библиотеке может служить понятие роли на проекте. +Каждая роль подразумевает набор определенных операций, которые должен "уметь" объект пользователь — User в программе. + +### Функционал программы +1. Создайте иерархию "Пользователи библиотеки" со следующими интерфейсами: + - Читатель – берет и возвращает книги. + - Библиотекарь – заказывает книги. + - Поставщик книг – приносит книги в библиотеку. + - Администратор – находит и выдает книги и уведомляет о просрочках времени возврата. +2. В методе `public static void main` создайте 2-3 объекта, реализующих эти интерфейсы. + +### Дополнительная информация +Учтите, что интерфейсов у пользователя (`User`) может быть несколько. +Объекты класса User могут взаимодействовать друг с другом (например, библиотекарь заказывает у поставщика). + +### Пример реализации +1. Создайте 4 интерфейса: `Reader`, `Librarian`, `Supplier`, `Administrator`. +Каждый из них должен содержать описанные выше методы. Например, у администратора должен быть метод `overdueNotification(Reader reader)`. +Методы могут принимать в качестве параметра других user-ов. Например, читатель берет книги у администратора, библиотекарь заказывает у поставщика и т.д. + +2. Создайте несколько классов, демонстрирующих использование интерфейсов. +В частности, продемонстрируйте совмещение, например, поставщик, который может быть также и читателем, библиотекарь – администратором и т.д. +В качестве реализации методов можно сделать вывод подробного сообщения в консоль по типу "Библиотекарь Вася заказал у поставщика Петя книгу Игра Престолов". \ No newline at end of file diff --git a/abstractions-interfaces/3.3.2/README.md b/abstractions-interfaces/3.3.2/README.md new file mode 100644 index 0000000..f5bd3fe --- /dev/null +++ b/abstractions-interfaces/3.3.2/README.md @@ -0,0 +1,25 @@ +## Задача 2. Банковские счета + +### Описание +Часто в проектировании программ нам удобно опираться на понятия, которые не представлены в реальном мире, +но служат удобной "опорой" для объединения нескольких классов. + +Так, например, в банковском деле нет абстрактного понятия "Счет". Каждый счет в банке имеет четкое назначение: сберегательный, кредитный, расчетный. +Но банковская программа работает с общими для счетов операциями как с одинаковыми объектами, и выполняет их, обращаясь к общему типу "Счет", +хотя его и невозможно явно инстанцировать в программе. Реализуйте этот сценарий, опираясь на механизмы полиморфизма. + +### Функционал программы +1. Создайте несколько классов — различных счетов на основе общего интерфейса: + - Сберегательный счет (`SavingsAccount`) + - Кредитный счет (`CreditAccount`) + - Расчетный счет (`CheckingAccount`) +2. Выполните перевод с одного счета на другой в методе `public static void main`. + +### Пример реализации +1. Создайте абстрактный класс `Account` с тремя методами: заплатить, перевести, пополнить (`pay(int amount)`, `transfer(Account account, int amount)`, `addMoney(int amount)`). +Платеж в нашем случае будет выглядеть просто как списание средств. +2. Добавьте классы Сберегательный, Кредитный, Расчетный (`SavingsAccount`, `CreditAccount`, `CheckingAccount` соответственно) как потомков класса Счет. +В них нужно переопределить методы базового класса. Каждый из них должен хранить баланс. Со сберегательного счета нельзя платить, только переводить и пополнять. Также сберегательный не может уходить в минус. +Кредитный не может иметь положительный баланс – если платить с него, то уходит в минус, чтобы вернуть в 0, надо пополнить его. +Расчетный может выполнять все три операции, но не может уходить в минус. +3. Продемонстрируйте работу счетов. Создайте три переменные типа `Account` и присвойте им три разных типа счетов. diff --git a/abstractions-interfaces/README.md b/abstractions-interfaces/README.md new file mode 100644 index 0000000..a4adce9 --- /dev/null +++ b/abstractions-interfaces/README.md @@ -0,0 +1,31 @@ +Домашнее задание к занятию 3.3. Основы ООП - абстракции и интерфейсы +== + +1. [Библиотека](3.3.1); + +Дополнительная задача со * : + +2. [Банковские счета](3.3.2); + +======= + +Задачи со звездочкой `*` необязательны для получения зачета. +Если вы хотите прислать дополнительное задание позже, напишите об этом при сдаче домашнего задания в личном кабинете на сайте [netology.ru](https://netology.ru). + +Любые вопросы по решению задач задавайте в чате учебной группы (ссылку вы найдете в письме на вашей эл. почте). + +## Инструкция по выполнению домашнего задания + +1. Пишите код в IDE (рекомендуем [Intellij Idea](https://www.jetbrains.com/idea/download/), версия Community). + 1. Почему лучше работать в IDE? — Ускоряет работу, есть подсветка ошибок, отладка по шагам. + 1. Почему Intellij Idea? — Родитель Android Studio, бесплатная, умная. +2. Опирайтесь на принятый [стиль оформления кода](https://github.com/netology-code/codestyle/blob/master/java/README.md). +3. Готовый код сдаем в Repl.it. Для этого зарегистрируйтесь на сайте [Repl.IT](http://repl.it/). +4. Перейдите в раздел **my repls**. +5. Нажмите кнопку **Start coding now!**, если приступаете впервые, или **New Repl**, если у вас уже есть работы. +6. В списке языков выберите `Java`. +7. Убедитесь, что на сайте всё работает так же, как и у вас на компьютере, нажав на кнопку **Run**. Результат появится в правой части окна. +8. После окончания работы скопируйте ссылку на ваш repl в адресной строке браузера. +9. В личном кабинете на сайте [netology.ru](http://netology.ru/) в поле комментария к домашней работе вставьте скопированную ссылку и отправьте работу на проверку. + +*Никаких файлов прикреплять не нужно.* diff --git a/diploma/img2txt-screenshot.png b/diploma/img2txt-screenshot.png new file mode 100644 index 0000000..7759c01 Binary files /dev/null and b/diploma/img2txt-screenshot.png differ diff --git a/diploma/javabasicsdiploma.zip b/diploma/javabasicsdiploma.zip new file mode 100644 index 0000000..d4c097d Binary files /dev/null and b/diploma/javabasicsdiploma.zip differ diff --git a/exceptions/3.4.1/README.md b/exceptions/3.4.1/README.md new file mode 100644 index 0000000..7b59992 --- /dev/null +++ b/exceptions/3.4.1/README.md @@ -0,0 +1,70 @@ +## Задача 1. Проверка доступа к ресурсу + +### Описание +В этом задании мы напишем программу для проверки доступа к ресурсу. Во время запуска программы нужно запросить логин или пароль пользователя. Если один из введеных параметров не совпадает (логин/пароль), то нужно выбросить checked исключение UserNotFoundException. Если возраст пользователя менее 18 лет, то нужно выбросить исключение AccessDeniedException, а если 18 и больше лет - вывести сообщение "Доступ предоставлен".
+
+Массив пользователей для авторизации нужно описать до запуска программы. Каждая запись пользователя содержит поля: login, password, age (возраст) и email. + +### Функционал программы +1. Создание Scanner для чтения логина и пароля пользователя из консоли; +2. Создание checked исключения UserNotFoundException; +3. Создание checked исключения AccessDeniedException; +4. Выбрасывать ошибку UserNotFoundException, если логин или пароль введены не верно; +5. Выбрасывать ошибку AccessDeniedException, если возраст пользователя меньше 18 лет; +5. Если ошибок не возникло, вывести сообщение "Доступ предоставлен". + +### Процесс реализации +1. Создадим класс User, в котором будем хранить инфомрацию о логине, пароле и возрасте пользователя: +class User, login, password, email, age; +2. Создадим класс исключение UserNotFoundException на основе базового класса Exception. Это исключение будем использовать, если пользователь ввел неверный логин или пароль: +```java +public class UserNotFoundException extends Exception { + public UserNotFoundException(String message) { + super(message); + } +} +``` +3. Аналогичным образом создадим класс исключения AccessDeniedException +4. Создадим класс Main, в котором создадим метод getUsers, этот метод должен возвращать список заранее созданных пользователей: +```java +public static User[] getUsers() { + User user1 = new User("jhon", "jhon@gmail.com", "pass", 24); + ... + return new User[]{user1, ...}; +} +``` +5. Создадим в классе Main метод getUserByLoginAndPassword(String login, String password), в этом методе нужно найти соответствие пары логина и пароля пользователя из массива, возвращаемого методом getUsers. Если пользователь не найден, выбрасываем исключение UserNotFoundException, если найден - возвращаем найденного пользователя: +```java +public static User getUserByLoginAndPassword(String login, String password) throws UserNotFoundException { + User[] users = getUsers(); + for (User user : users) { + ... + } + throw new UserNotFoundException("User not found"); +} +``` +6. Создадим к классу Main еще один метод validateUser для проверки возрастра пользователя. Если возраст менее 18 лет, метод должен выбросить исключение AccessDeniedException: +```java +public static void validateUser(User user) throws AccessDeniedException +``` +7. Добавим последний метод в классе Main для запуска программы public static void main(String[] args) throws UserNotFoundException, AccessDeniedException +В нем нужно запросить логин и пароль пользователя, проверить есть ли данная пара "логин и пароль" в массиве пользователей и последним шагом провалидировать возраст. +```java + public static void main(String[] args) throws UserNotFoundException, AccessDeniedException { + + Scanner scanner = new Scanner(System.in); + + System.out.println("Введите логин"); + String login = scanner.nextLine(); + System.out.println("Введите пароль"); + String password = scanner.nextLine(); + + //Проверить логин и пароль + + //Вызвать методы валидации пользователя + + System.out.println("Доступ предоставлен"); + } + +``` +8. Программа завершена. Отличная работа! diff --git a/exceptions/3.4.2/README.md b/exceptions/3.4.2/README.md new file mode 100644 index 0000000..25e1d21 --- /dev/null +++ b/exceptions/3.4.2/README.md @@ -0,0 +1,55 @@ +## Задача 2. Валидация прочитанных событий + +### Описание +Для выполнения задачи со звездочкой мы напишем программу проверки коррекности прочитанных значений. Для этого подготовим список событий - такими событиями (event) могут быть фильмы/спектакли.
+
+Базовый класс event содержит поля: название (title), год выпуска (releaseYear), ограничение по возрасту (age).
+
+Если любое из полей прочитанного объекта равно null или 0 (для целочисленных полей), нужно выбсроить RuntimeException и завершить работу программы, если ошибок не возникло - вывести сообщение "Все события корректны".
+
+### Функционал программы +1. Создание заранее подготовленного списока событий - отдельно для кино и отдельно для театров; +2. Возможность валидации каждолго из списка событий с помощью универсального метода; +3. Если хотя бы одно из событий содержит поля со значением null или 0, завершить работу программы и вывести это событие; +4. Если ошибок не возникло, вывести сообщение "Все события корректны". + +### Процесс реализации +1. Создадим класс Event для описания базового события с полями title, releaseYear и age (класс можно сделать абстрактным); +2. Переопределим метод toString для класса Event, чтобы вывести значения всех полей; +3. Создадим два дочерних класса от класса Event - Movie и Theatre; +4. Создадим класс Main в котором нужно создать два метода для получения массива Movies, Theatres: +```java + public static Movie[] getMovies() { + return new Movie[]{ + new Movie("Начало", 2010, 16), + ... + }; + } + + public static Theatre[] getTheatres() { + return new Theatre[]{ + new Theatre("Анна Каренина", 2017, 16), + ... + }; + } +``` +5. Добавим в класс Main метод для валидации событий (Event) +```java +public static void validEvent(Event event) +``` +Если хоть одно из полей не заполнено, нужно выбросить исключение throw new RuntimeException, обрабатывать +или перехватывать эту ошибку нигде не нужно. + +6. Добавим в класс Main метод main для запуска и валидации созданных событий: +```java +public static void main(String[] args) { + for (Event event: getMovies()) { + validEvent(event); + } + for (Event event: getTheatres()) { + validEvent(event); + } + System.out.println("Все события корректны"); +} +``` +7. Завершим работу программы. Прекрасно! diff --git a/exceptions/README.md b/exceptions/README.md new file mode 100644 index 0000000..868b9d7 --- /dev/null +++ b/exceptions/README.md @@ -0,0 +1,35 @@ +# Домашнее задание к занятию исключения и stacktrace + +Привет!
+Чтобы выполнить домашнее задание, вам необходимо решить обязательную задачу и отправить ее на проверку преподавателю. Задача со звездочкой предназначена для более углубленного понимания и закрепления метериала - ее решать не обязательно. + +Обязательная задача: + +1. [Проверка доступа к ресурсу](3.4.1); + +Дополнительная задача со * : + +2. [Валидация прочитанных событий](3.4.2); + +======= + +Задачи со звездочкой `*` необязательны для получения зачета. +Если вы хотите прислать дополнительное задание позже, напишите об этом при сдаче домашнего задания в личном кабинете на сайте [netology.ru](https://netology.ru). + +Любые вопросы по решению задач задавайте в чате учебной группы (ссылку вы найдете в письме на вашей эл. почте). + +## Инструкция по выполнению домашнего задания + +1. Пишите код в IDE (рекомендуем [Intellij Idea](https://www.jetbrains.com/idea/download/), версия Community). + 1. Почему лучше работать в IDE? — она ускоряет работу, есть подсветка ошибок, отладка по шагам. + 1. Почему Intellij Idea? — родитель Android Studio, бесплатная, умная. +2. Опирайтесь на принятый [стиль оформления кода](https://github.com/netology-code/codestyle/blob/master/java/README.md). +3. Готовый код сдаем в Repl.it. Для этого зарегистрируйтесь на сайте [Repl.IT](http://repl.it/). +4. Перейдите в раздел **my repls**. +5. Нажмите кнопку **Start coding now!**, если приступаете впервые, или **New Repl**, если у вас уже есть работы. +6. В списке языков выберите `Java`. +7. Убедитесь, что на сайте всё работает так же, как и у вас на компьютере, нажав на кнопку **Run**. Результат появится в правой части окна. +8. После окончания работы скопируйте ссылку на ваш repl в адресной строке браузера. +9. В личном кабинете на сайте [netology.ru](http://netology.ru/) в поле комментария к домашней работе вставьте скопированную ссылку и отправьте работу на проверку. + +*Никаких файлов прикреплять не нужно.* diff --git a/generics/README.md b/generics/README.md new file mode 100644 index 0000000..20cc4cf --- /dev/null +++ b/generics/README.md @@ -0,0 +1,28 @@ +# Домашнее задание к занятию 4.1: Generics в коллекциях и методах + +Необходимо выполнить и предоставить на проверку следующие задачи: + +1. [Первый дженерик класс](./task1/README.md); +2. [Дженерик класс с двумя параметрами](./task2/README.md); +3. [Наследование дженерик классов](./task3/README.md) (со звездочкой *); + +======= + +Задачи со звездочкой `*` необязательны для получения зачета. +Если вы хотите прислать дополнительное задание позже, напишите об этом при сдаче домашнего задания в личном кабинете на сайте [netology.ru](https://netology.ru). + +Любые вопросы по решению задач задавайте в чате Slack (ссылку вы найдете в письме на вашей эл. почте). + +## Инструкция по выполнению домашнего задания + +1. Зарегистрируйтесь на сайте [repl.it](http://repl.it/) +2. Перейдите в раздел **my repls**. +3. Нажмите кнопку **Start coding now!** - если вы приступаете впервые, или **New Repl** - если у вас уже есть работы. +4. В списке языков выберите `Java`. +5. Код пишите в левой части окна - вместо строки `System.out.println("Hello world!");`. +6. Опирайтесь на принятый [стиль оформления кода](https://github.com/netology-code/codestyle/blob/master/java/README.md). +7. Чтобы посмотреть результат выполнения файла, нажмите на кнопку **Run**. Результат появится в правой части окна. +8. После окончания работы скопируйте ссылку на ваш repl в адресной строке браузера. +9. Скопированную ссылку (ваше решение ДЗ) нужно отправить на проверку. Для этого перейдите в личный кабинет на сайте [netology.ru](http://netology.ru/), в поле комментария к домашней работе вставьте скопированную ссылку и отправьте работу на проверку. + +*Никаких файлов прикреплять не нужно.* diff --git a/generics/task1/README.md b/generics/task1/README.md new file mode 100644 index 0000000..20e43c5 --- /dev/null +++ b/generics/task1/README.md @@ -0,0 +1,73 @@ +# Задача 1: Первый дженерик-класс + +## Описание +Для закрепления лекционного материала попрактикуемся в том, как создавать дженерики. + +Создайте типизированный класс `Box`. Для того чтобы класс стал дженериком, после указания имени класса добавьте параметр `T` в треугольных скобках `<>`: +```java +class Box{ + +} +``` + +Класс `Box` будет обладать лишь одним полем `private T obj`, значение которого может быть получено через конструктор класса. Конструктор класса будет выглядеть следующим образом: +```java +public Box(T obj) { + this.obj = obj; +} +``` + +Обратите внимание, что конкретный тип переменной, передаваемой в качестве параметра в конструктор, на данном этапе не указывается. Вместо этого используется параметр `T`, который будет заменен на реальный тип в момент создания объекта. + +Для работы с полем класса, добавьте два метода `setObj()` и `getObj()`: +```java +public void setObj(T obj) { + this.obj = obj; +} + +public T getObj() { + return this.obj; +} +``` + +В данном случае метод `setObj()` по своему синтаксису напоминает приведенный выше конструктор класса. А вот метод `getObj()` примечателен тем, что в качестве возвращающего объекта он вернет объект типа `T`. + +Для проверки того, что параметр `T` действительно может быть разным для разных объектов класса `Box`, переопределим метод `toString()`, который будет выводить значение и тип объекта `obj`: +```java +@Override +public String toString() { + return "Box{" + + "obj=" + obj + + "; objType=" + obj.getClass().getName() + + '}'; +} +``` + +## Реализация +Создадайте несколько экземпляров класса `Box`, используя при этом различные типы: +```java +public class Main { + public static void main(String a[]) { + // параметризируем класс типом String + Box sample1 = new Box<>("Нетология"); + System.out.println(sample1); + // параметризируем класс типом Integer + Box sample2 = new Box<>(1); + System.out.println(sample2); + // параметризируем класс типом Boolean + Box sample3 = new Box<>(Boolean.TRUE); + System.out.println(sample3); + } +} +``` + +Обратите внимание на то, что здесь использован так называемый алмазный синтаксис, который позволяет указывать тип параметра только с левой стороны выражения. + +В коде закралась ошибка. Поправьте ее и оставьте комментарий. Опишите причину ошибки и ее решение. + +В результате выполнения программы, в консоле вы должны увидеть следующие строки: +``` +Box{obj=Нетология; objType=java.lang.String} +Box{obj=1; objType=java.lang.Integer} +Box{obj=true; objType=java.lang.Boolean} +``` diff --git a/generics/task2/README.md b/generics/task2/README.md new file mode 100644 index 0000000..19e1f7d --- /dev/null +++ b/generics/task2/README.md @@ -0,0 +1,59 @@ +# Задача 2: Дженерик класс с несколькими параметрами + +## Описание +У дженерик класса может быть несколько параметров. + +Расширьте созданный в первой задача типизированный класс `Box`. Помимо параметра `T` добавьте параметр `K`: +```java +class Box{ + +} +``` + +Теперь класс `Box` будет обладать двумя полями: +```java +private K key; +private T obj; +``` + +Их значения могут быть получены через конструктор класса. Конструктор класса будет выглядеть следующим образом: +```java +public Box(K key, T obj){ + this.key = key; + this.obj = obj; +} +``` + +Для работы с переменными класса добавьте методы `get` и `set`. Метод `toString()` будет выводить значения и типы объектов класса `Box`: +```java +@Override +public String toString() { + return "Box{" + + "key=" + key + + "; keyType=" + key.getClass().getName() + + ", obj=" + obj + + "; objType=" + obj.getClass().getName() + + '}'; +} +``` + +## Реализация +Создадим несколько экземпляров класса `Box`, используя при этом различные типы: +```java +public class Main { + public static void main(String a[]) { + // параметризируем класс типом String для ключа и значения + Box sample1 = new Box<>("имя", "Нетология"); + System.out.println(sample1); + // параметризируем класс типом Integer для ключа и Boolean для значения + Box sample2 = new Box<>(1, Boolean.TRUE); + System.out.println(sample2); + } +} +``` + +В результате выполнения программы в консоле увидим следующие строки: +``` +Box{key=имя; keyType=java.lang.String, obj=Нетология; objType=java.lang.String} +Box{key=1; keyType=java.lang.Integer, obj=true; objType=java.lang.Boolean} +``` diff --git a/generics/task3/README.md b/generics/task3/README.md new file mode 100644 index 0000000..811eccf --- /dev/null +++ b/generics/task3/README.md @@ -0,0 +1,78 @@ +# Задача 3: Наследование дженерик классов (со звездочкой *) + +## Описание +В данной задаче требуется реализовать коробку, в которую можно будет положить только вкусные фрукты и нельзя будет положить полезные овощи. + +Начните с того, что создайте обобщающий класс фрутов: +```java +class Fruit { + public void printClass() { + System.out.println("I am super class Fruit"); + } +} +``` + +Далее создайте несколько подтипов фруктов, которые будут унаследованы от общего предка `Fruit`: +```java +class Apple extends Fruit { + @Override + public void printClass() { + System.out.println("I am sub class Apple"); + } +} + +class Banana extends Fruit { + @Override + public void printClass() { + System.out.println("I am sub class Banana"); + } +} +``` + +Создайте один полезный овощ: +```java +class Cabbage { + public void printClass() { + System.out.println("I am Cabbage"); + } +} +``` + +Теперь создайте дженерик коробку, в которую можно будет положить только фрукты. Реализуется это путем указания, от какого класса может быть наследован параметр `T`: +```java +class Box { + // Реализация класса коробки из предыдущего задания +} +``` + +## Реализация +Создайте несколько фруктов и поместите в созданные специально для них коробки: +```java +public class Main { + public static void main(String a[]) { + Box bananaBox = new Box<>("banana", new Banana()); + bananaBox.getObj().printClass(); + + Box appleBox = new Box<>("apple", new Apple()); + appleBox.getObj().printClass(); + + Box fruitBox = new Box<>("fruit", new Fruit()); + fruitBox.getObj().printClass(); + + Box cabbageBox = new Box<>("cabbage", new Cabbage()); + cabbageBox.getObj().printClass(); + } +} +``` + +Обратите внимание, что в коде выше есть ошибка. Найдите ошибку и с помощью комментария объясните, по какой причине она возникла. + +Исправьте ошибку. По аналогии с созданной коробкой для фруктов, создайте вторую коробку `VegetableBox`, которая бы хранила в себе только полезные овощи `Vegetable`, и положите в нее полезную капусту. + +В случае успешного выполнения задания, Вы увидите в консоле следующие строки: +``` +I am sub class Banana +I am sub class Apple +I am super class Fruit +I am Cabbage +``` diff --git a/hash-collections/4.3.1/README.md b/hash-collections/4.3.1/README.md new file mode 100644 index 0000000..9d4b187 --- /dev/null +++ b/hash-collections/4.3.1/README.md @@ -0,0 +1,25 @@ +## Задача 1 (HashMap). Телефонный справочник + +### Описание +Эта задача про телефонный справочник с поддержкой групп контактов. Один контакт может входить в несколько групп. +Например, если вы работаете со своим другом, то он будет в группах "Друзья" и "Работа". +Должна быть возможность создания групп и контактов, добавления одного контакта в несколько групп. +Вам предстоит разработать систему классов: +* `Contact` - класс контакт +* `PhoneBook` - класс телефонной книги с контактами и группами. + +Общаться с пользователем в `main` необязательно, просто продемонстрируйте работспособность ваших классов. + +### Функционал классов +1. Создание группы контактов; +2. Создание контакта; +3. Добавление контакта в разные группы; +4. Поиск контактов по группе; +5. Поиск контакта по номеру (одну из этих двух последних операций можно сделать перебором); + +### Реализация +1. Создадим класс `PhoneBook`, в котором будем хранить все созданные группы. +2. В классе `PhoneBook` создадим `HashMap`: ключом для этой коллекции будет название группы, а значением — список контактов (`List`). +3. Создадим класс `Contact` c полями: имя и номер телефона (при необходимости переоределим `hashCode, equals, toString`). +4. Создадим методы для добавления группы и контакта в группы в классе `PhoneBook`. +5. Для демонстрации работы программы в коде создадим несколько контактов и добавим их в несколько групп. diff --git a/hash-collections/4.3.2/README.md b/hash-collections/4.3.2/README.md new file mode 100644 index 0000000..175ce44 --- /dev/null +++ b/hash-collections/4.3.2/README.md @@ -0,0 +1,30 @@ +## Задача 2 (HashSet). Список студентов + +### Описание +Вы разрабатываете систему учета студентов. Для каждого студента нужно хранить следующие данные – ФИО, номер группы, номер студенческого билета. +Уникальным идентификатором является номер студенческого билета. Пользователь вводит данные студентов в бесконечном цикле до ввода команды "end". +По окончании ввода программа должна вывести список студентов. +Структура данных, куда сохраняются студенты, должна отбрасывать ввод студента с уже существующим в базе id и писать об этом пользователю. +Учитывайте, что имена у людей могут быть одинаковыми, а номера документов – нет. + +### Функционал программы +1. Ввод информации о студентах; +2. Вывод списка студентов. + +### Пример +``` +Введите информацию о студенте: "ФИО, номер группы, номер студенческого билета" +Иванов Петр Николаевич, 1243-Б, 31231343 +Введите информацию о студенте (для завершения работы программы введите "end") +Петрова Татьяна Михайловна, 1243-Б, 43221343 +Введите информацию о студенте (для завершения работы программы введите "end") +end +Список студентов: + - Иванов Петр Николаевич, 1243-Б, 31231343 + - Петрова Татьяна Михайловна, 1243-Б, 43221343 +``` + +### Реализация +1. Создайте класс `Student` с полями `name`, `group`, `studentId`. Тип каждого поля – `String`. +2. Переопределите методы `hashcode` и `equals` для класса `Student` так, чтобы нельзя было сохранить двух студентов с одинаковым номером студенческого билета. +3. Продемонстрируйте добавление объектов класса в `HashSet` (его создайте в `Main`), ошибку при добавлении студентов с одинаковым номером, возможность существования студентов с одинаковыми именами (но разными `id`). diff --git a/hash-collections/README.md b/hash-collections/README.md new file mode 100644 index 0000000..580af0f --- /dev/null +++ b/hash-collections/README.md @@ -0,0 +1,31 @@ +# Домашнее задание к занятию 4.3. Коллекции HashMap, HashSet + +Необходимо выполнить и предоставить на проверку следующие задачи: + +1. [Телефонный справочник](4.3.1); +2. [Список студентов](4.3.2); + +======= + +Задачи со звездочкой `*` необязательны для получения зачета. +Если вы хотите прислать дополнительное задание позже, напишите об этом при сдаче домашнего задания в личном кабинете на сайте [netology.ru](https://netology.ru). + +Любые вопросы по решению задач задавайте в чате учебной группы (ссылку вы найдете в письме на вашей эл. почте). + + +## Инструкция по выполнению домашнего задания + +1. Пишите код в IDE (рекомендуем [Intellij Idea](https://www.jetbrains.com/idea/download/), версия Community). + 1. Почему лучше работать в IDE? - Ускоряет работу, есть подсветка ошибок, отладка по шагам. + 3. Почему Intellij Idea? - Родитель Android Studio, бесплатная, умная. +3. Опирайтесь на принятый [стиль оформления кода](https://github.com/netology-code/codestyle/blob/master/java/README.md). +4. Готовый код сдаем в Repl.it. +Для этого зарегистрируйтесь на сайте [Repl.IT](http://repl.it/). +6. Перейдите в раздел **my repls**. +7. Нажмите кнопку **Start coding now!**, если приступаете впервые, или **New Repl**, если у вас уже есть работы. +8. В списке языков выберите `Java`. +9. Убедитесь что на сайте всё работает также как и у вас на компьютере, нажав на кнопку **Run**. Результат появится в правой части окна. +10. После окончания работы скопируйте ссылку на ваш repl в адресной строке браузера. +11. В личном кабинете на сайте [netology.ru](http://netology.ru/) в поле комментария к домашней работе вставьте скопированную ссылку и отправьте работу на проверку. + +*Никаких файлов прикреплять не нужно.* diff --git a/java_additional_materials.md b/java_additional_materials.md new file mode 100644 index 0000000..cbde644 --- /dev/null +++ b/java_additional_materials.md @@ -0,0 +1,45 @@ +Материалы по программированию на Java и не только +=================== + +Для любого уровня +=================== + +## Подкасты +1. https://razborpoletov.com/index.html +1. https://radio-t.com/ + +Для начального уровня +=================== + +## Книги +1. **Java. Полное руководство**, 2018, Герберт Шилдт +1. **Java. Библиотека профессионала. Том 1. Основы**, Хорстманн Кей С +1. **Java. Библиотека профессионала. Том 2. Расширенные средства программирования**, Хорстманн Кей С +1. **Изучаем Java**, Берт Бейтс и Кати Сьерра +1. **Head First Java** Kathy Sierra + +После изучения минимальной базы: +1. **Философия Java**, Брюс Эккель + +Для среднего уровня +=================== + +## Книги +1. **Effective Java**, Джошуа Блох +1. **Чистый код**, Роберт Мартин +1. **Алгоритмы на Java**, Роберт Седжвик, Кевин Уэйн +1. **Структуры данных и алгоритмы в Java**, Лафоре Роберт +1. **Современные операционные системы**, Эндрю Таненбаум +1. **Архитектура компьютера**, Эндрю Таненбаум + +## Задачи для тренировки +1. https://www.hackerrank.com/ +1. https://leetcode.com/ + +## Соревнования +1. https://codeforces.com/ + +Для продвинутого уровня +=================== +1. **Java Concurrency in Practice**, 2006, Брайан Гётц + diff --git a/java_codestyle.md b/java_codestyle.md new file mode 100644 index 0000000..c572fb3 --- /dev/null +++ b/java_codestyle.md @@ -0,0 +1,228 @@ +# Правила оформления кода на Java + +1. [Файлы и пакеты](#1-Файлы--пакеты) +2. [Отступы. Длина строки. Переносы строк](#2-Отступы-длина-строки-переносы-строк) +3. [Расположение блоков и операторов. Пробелы. Скобки](#3-Расположение-блоков-и-операторов-Пробелы-Скобки) +4. [Имена методов и переменных](#4-Имена-методов-и-переменных) +5. [Структурирование кода](#5-Структурирование-кода) +6. [Комментарии и Javadoc](#6-Комментарии-и-Javadoc) +7. [Импорты](#7-Импорты) +8. [Локальные переменные](#8-Локальные-переменные) + + +## 1. Файлы и пакеты + +* Имена классов должны быть существительными, первые буквы всех слов — заглавные. +* Имя файла содержащего публичный класс должно совпадать с именем этого класса (+ расширение `.java`). +* В одном файле может находиться только один класс или интерфейс (за исключением вложенных классов и интерфейсов). +* Имена папок и пакетов состоят только из строчных букв. Слова в многословных названиях разделяются подчеркиванием. +* Используйте UTF-8, как кодировку для Ваших исходных файлов (она выбирается по умолчанию). +* Описание файла должно быть в самом начале. Далее идут объявления операторов package и import, причем каждый блок разделяется пустой строкой. + +## 2. Отступы. Длина строки. Переносы строк + +* Отступы должны составлять строго 4 пробельных символа; +```java +class Program { + + public static void main(String[] args) { + int value1 = 1; + int value2 = 2; + int result = value1 + value2; + System.out.println(result); + } +} +``` +Перед `public static void main(String[] args)` 4 пробельных символа +Перед `int value1` и строками ниже, тоже 4 пробельных символа, относительно предыдущего блока `public static void main(String[] args)`, а вот относительно самого края ихсодного кода уже 8 пробельных символов; + +* Символы табуляции не используются для отступов; +* Длина строки не должна превышать 100 символов (в редакторе кода серая линия справа обозначает эту границу). +* При превышении длины строки, выражение разбивается согласно следующим правилам: + 1. перенос после запятой; + 2. перенос перед оператором; + 3. используйте отступ в 8 пробелов для обозначения второй строки разделенного выражения; + 4. последующие строки выравниваются по второй строке либо добавляются новые 8 пробелов для обозначения вложенности. + +Пример: + +```java +int result = someLongExpression(this, expression, on, first, line) + + someLongExpression(this, expression, on, seccond, line) +``` + +> Многое из описанного выше Android Studio, так же как её родитель Intellij Idea, умеет делать автоматически +> * Windows: `Ctrl + Alt + L` +> * Linux: `Ctrl + Shift + Alt + L` +> * macOS: `Option + Command + L` + +## 3. Расположение блоков и операторов. Пробелы. Скобки + +* Между именем метода и скобками для списка параметров нет пробела. + +```java +getStaffList(String name) +``` + +* Параметры разделяются пробелом. + +```java +getStaffList(String name, int count) +``` + +* Пробелы окружают любой оператор. + +```java +res = getCount(); +(a > 10) ? b : c; +``` + +* Ключевое слово и следующая за ним скобка `(` должны разделяться пробелом. + +```java +while (b < 100) { + … +} +``` + +* Открывающаяся скобка `{` располагается на той же строке, что и сигнатура метода/заголовок `if`, `while`-блока и т.п. + +* Закрывающаяся скобка `}` выровнена по строке начала данного блока. + +```java +public Collection getStaffList(String name) { + Collection contacts = Contact.getList(name, RoleHelper.ROLE_AGENT, null, + AccessLevel.getStaffDiaryEditLevel(), 0, MAX_NUMBER); + return ListHelper.getLabelValueList(contacts); +} +``` + +* Методы разделяются пустой строкой, объявления свойств класса располагаются по одному на строку. + +* На строке располагается только один оператор. + +```java +if (b) { + return result; +} +``` + +> Всё описанное в этом пункте, Android Studio (Intellij Idea) может сделать для вас автоматически с помощью комбинации клавиш: +> * Windows: `Ctrl + Alt + L` +> * Linux: `Ctrl + Shift + Alt + L` +> * macOS: `Option + Command + L` + +## 4. Имена методов и переменных + +* Названия методов должны быть глаголами, первая буква должна быть строчной (например `getName()`, `setYear(int year)`); +* Имена переменных должны начинаться со строчной буквы; +* Придерживайтесь следующих названий полей: + * Имена полей начинаются с буквы нижнего регистра; + * Поля `public static final` (константы) пишутся полностью в верхнем регистре, с использованием подчеркивания (`ALL_CAPS_WITH_UNDERSCORES`). + + +## 5. Структурирование кода + +* Методы должны быть короткими, и выполнять только одну задачу соответствующую его имени; +* Имена методов должны быть самодокументированными; +* Шаблоны ООП должны применяться для структурирования и облегчения восприятия. + + +## 6. Комментарии и Javadoc + +* Описание файла в самом начале. - комментарий. +* Для описания классов используется Javadoc, лучше начинать фразу с описательного глагола 3-го лица. +* Не нужно описывать Javadoc для тривиальных `get` и `set` методов. +* Если метод делает что-то более сложное (например, соблюдение неких ограничений, или если его действия имеют важный эффект вне его самого), тогда его стоит задокументировать. Вообще, любой метод, полезно описывать в Javadoc, неважно `public` он или нет. `Public` методы являются частью API, и поэтому необходимы описания в Javadoc +* Стиль TODO. Используйте комментарии TODO для кода, который является временным, краткосрочным, или хорошим, но не идеальным. Комментарий должен включать в себя «TODO:», например: + +```java +// TODO: Remove this code after the UrlTable2 has been checked in. + +// TODO: Change this to use a flag instead of a constant. +``` + +Если ваш комментарий имеет вид «В будущем сделать что-то», то убедитесь, что он включает в себя конкретную дату (1 января 2011 года), или конкретное событие «Удалить после выхода версии 2.1». + + +## 7. Импорты + +Порядок операторов импорта следующий: +1. Android импорты. + +2. Сторонние импорты ( `com`, `junit`, `net`, `org`). + +3. `java` и `javax`. + +Для полного соответствия настройкам IDE, импорты должны иметь следующий вид: +* Отсортированы по алфавиту внутри каждой группы. +* Заглавные буквы должны быть впереди букв нижнего регистра (например, Z перед a). +* Главные группы должны разделяться пустой строкой. + +> Как хорошо что вам не придется делать этого самостоятельно, Android Studio (Intellij Idea) упорядочит их автоматически по сочетанию клавиш. +> * Windows: `Ctrl + Alt + L` +> * Linux: `Ctrl + Shift + Alt + L` +> * macOS: `Option + Command + L` + +## 8. Локальные переменные + +* Область видимости локальных переменных должна сводиться к минимуму. Делая это, вы улучшаете читаемость и поддерживаемость кода, а также уменьшаете вероятность ошибок. +* Каждая переменная должна объявляться в самом глубоком блоке, который окружает все возможные места использования переменной. + +* Локальные переменные должны объявляться в том месте, где впервые необходимо её использовать. +* Почти каждая локальная переменная нуждается в инициализаторе. +* Отложите объявление локальной переменной, пока вы не узнаете, как ее инициализировать. + +*! Исключение:* + +Это исключение касается блока `try-catch`. Если переменная инициализируется при помощи оператора `return` метода, который выбрасывает проверяемое исключение, то она должна инициализироваться в блоке `try`. Если же переменная должна использоваться вне блока `try`, тогда она объявляется перед ним, неважно, знаете ли вы, как её нужно инициализировать, или нет: + +```java +// Instantiate class cl, which represents some sort of Set +Set s = null; +try { + s = (Set) cl.newInstance(); +} catch(IllegalAccessException e) { + throw new IllegalArgumentException(cl + " not accessible"); +} catch(InstantiationException e) { + throw new IllegalArgumentException(cl + " not instantiable"); +} + +// Exercise the set +s.addAll(Arrays.asList(args)); +``` + + +Однако этот случай можно обойти при помощи инкапсуляции блока `try-catch` в методе. + +```java +Set createSet(Class cl) { + // Instantiate class cl, which represents some sort of Set + try { + return (Set) cl.newInstance(); + } catch(IllegalAccessException e) { + throw new IllegalArgumentException(cl + " not accessible"); + } catch(InstantiationException e) { + throw new IllegalArgumentException(cl + " not instantiable"); + } +} + +... + +// Exercise the set +Set s = createSet(cl); +s.addAll(Arrays.asList(args)); +``` + + +* Переменные в циклах должны объявляться внутри самого оператора, если только нет непреодолимой причины этого не делать. + +```java +for (int i = 0; i <= n; i++) { + doSomething(i); +} + +for (Iterator i = c.iterator(); i.hasNext(); ) { + doSomethingElse(i.next()); +} +``` diff --git a/java_glossary.md b/java_glossary.md new file mode 100644 index 0000000..99831bb --- /dev/null +++ b/java_glossary.md @@ -0,0 +1,727 @@ +Словарь терминов. Основы Java +================================== + +Уважаемые студенты, в первые недели обучения программированию на Java вы столкнулись с новыми терминами, значение которых, возможно, не сразу запоминается. +Чтобы помочь вам запомнить новые термины и быстро подсмотреть их значение +в нужный момент, мы предлагаем вам воспользоваться этим глоссарием. +В нем вы найдете объяснения терминов из трех блоков: основы Java, массивы и ООП. + +Обратите внимание, что слова расположены в алфавитном порядке. Для быстрого перехода к нужному термину используйте команду “Поиск в документе” (Ctrl+F). + + +D +============= + +### Do while / цикл “делать до тех пор пока” / цикл с постусловием + +Do while - оператор **цикла**, который повторяет блок кода, пока заданное условие является верным (его еще называют цикл "делать до тех пор пока"). Используется, когда заранее неизвестно, сколько раз нужно что-то сделать, но при этом известны условия прекращения цикла (и эти условия должны проверяться строго после того, как выполнится тело цикла). Цикл do while проверяет условия в конце тела цикла, поэтому называется циклом с постусловием. Цикл do…while удобно использовать, когда некоторое действие в программе нужно выполнить по крайней мере единожды, но при некоторых условиях придётся повторять его многократно. Цикл имеет следующий синтаксис: + + do { + инструкция; + ... + инструкция; / инструкции внутри фигурных скобок составляют тело цикла + } while (условие); + +**Пример:** выведем на экран числа от 1 до 5 + + int i = 0; + do { + i = i + 1; + System.out.print(i); + } while(i < 5); + +*Подробнее в лекции:* + +1. лекция “4 Циклы” из “Блок 0. Введение в Java (Basic Java BJAVA)”, +2. лекция “1.3 Условные операторы и циклы” из “Блок 1. Основы Java”. + + + +F +================= + +### For / цикл со счетчиком + +For - оператор **цикла**, который выполняет последовательность кода (тела цикла) столько раз, сколько определено в его переменной счетчика, и называется циклом “со счетчиком”. Такой цикл хорошо подходит, когда заранее точно известно, сколько раз нужно повторить одно и то же действие (или набор действий). Цикл имеет следующий синтаксис: + + for (начало; условие; шаг) { + // ... тело цикла ... + } + +*Начало* - это объявление и инициализация переменной, которая является счетчиком выполненных итераций цикла. *Условие* - это выражение, выполняющееся на каждой итерации цикла (если выражение истинно, цикл выполняется). *Шаг* - это выражение, которое выполняется в самом конце цикла и используется для обновления (увеличения) значения переменной счётчика. + +**Пример:** выведем на экран числа от 1 до 5 + + for (int i = 1; i < 6; i++) { + System.out.print(i); + } + // Результатом будет: 1 2 3 4 5 + +*Подробнее в лекции:* + +1. лекция “4 Циклы” из “Блок 0. Введение в Java (Basic Java BJAVA)”, +2. лекция “1.3 Условные операторы и циклы” из “Блок 1. Основы Java”. + + + +### Foreach + +Foreach является оператором **цикла**, разновидностью цикла **for**. Используется для перебора элементов **массива** или коллекции. Его сигнатура не включает присвоение начального значения счетчика и его последующий инкремент (увеличение). + +**Пример:** для того чтобы вывести слово Борщ, перебрав все элементы массива, достаточно использовать цикл с перебором элементов этого массива. + + char[] borsh = {'Б','о', 'р', 'щ'}; + foreach(char letter : borsh) { + System.out.print(letter); + } + +*Подробнее в лекции:* +лекция “1.3 Условные операторы и циклы” из “Блок 1. Основы Java”. + + + +J +=================== + +### Java + +Java — объектно-ориентированный язык программирования высокого уровня, был разработан Джеймсом Гослингом и компанией Sun Microsystems (впоследствии поглощенной компанией Oracle). Первая версия языка была выпущена 21 января 1996 г. С сентября 2018 года актуальной версией является Java 11. + +Java превратилась из просто универсального языка в целую платформу и экосистему, которая объединяет различные технологии, используемые для целого ряда задач: от создания десктопных приложений (программы, которые запускаются с рабочего стола компьютера) до написания крупных веб-порталов. + +Ключевой особенностью языка Java является то, что его код сначала транслируется в специальный **байт-код**, независимый от операционной среды, а затем этот байт-код выполняется виртуальной машиной **JVM (Java Virtual Machine)**, которая устанавливается на любую операционную среду. + +[*Подробнее >*](https://ru.wikipedia.org/wiki/Java) + +[*Подробнее про высокоуровневое программирование >*](https://ru.wikipedia.org/wiki/%D0%92%D1%8B%D1%81%D0%BE%D0%BA%D0%BE%D1%83%D1%80%D0%BE%D0%B2%D0%BD%D0%B5%D0%B2%D1%8B%D0%B9_%D1%8F%D0%B7%D1%8B%D0%BA_%D0%BF%D1%80%D0%BE%D0%B3%D1%80%D0%B0%D0%BC%D0%BC%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D1%8F) + +[*Подробнее про объектно-ориентированное программирование >*](https://ru.wikipedia.org/wiki/%D0%9E%D0%B1%D1%8A%D0%B5%D0%BA%D1%82%D0%BD%D0%BE-%D0%BE%D1%80%D0%B8%D0%B5%D0%BD%D1%82%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%BD%D0%BE%D0%B5_%D0%BF%D1%80%D0%BE%D0%B3%D1%80%D0%B0%D0%BC%D0%BC%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5) + + + +### Java-байт-код / байт-код Java / байт-код / bytecode + +Байт-код Java — набор команд, в которые преобразуется (компилируется) программа, написанная на языке **java**. Эти команды затем исполняются **виртуальной машиной Java (JVM)**. Каждая такая команда занимает в памяти 1 байт. Перед тем как запустить любую программу на Java, нужно обязательно компилировать написанный код в команды, которые будут выполняться на JVM. Для программирования на языке Java знание особенностей байт-кода не обязательно. + +[*Подробнее >*](https://ru.wikipedia.org/wiki/%D0%91%D0%B0%D0%B9%D1%82-%D0%BA%D0%BE%D0%B4_Java) + + + +### Javac + +Javac - специальная программа-компилятор (входит в **Java Development Kit**), которую нужно использовать для преобразования программы, написанной на языке **java**, в **байт-код**, исполняемый **виртуальной машиной Java**. Компиляция с помощью javac осуществляется либо в **консоли** (в режиме “командной строки”), либо через **IDE**. + +[*Подробнее >*](https://ru.wikipedia.org/wiki/Javac) + + + +### JDK / Java Development Kit + +JDK - комплект средств (сервисов) разработчика. Содержит необходимые библиотеки и подпрограммы для запуска, компиляции и отладки программ на языке java. Используется при разработке программ на языке java. Разрабатывается компанией Oracle и open-source community. Все современные **интегрированные среды разработки (IDE)** для java, такие как IDEA, Eclipse, NetBeans, Android Studio, используют JDK. + +**Пример:** + +1) Java SE Development Kit 8 - Downloads Инструкция по установке: https://github.com/netology-code/guides/tree/master/intellij_idea +2) https://openjdk.java.net/ + +[*Подробнее >*](https://ru.wikipedia.org/wiki/Java_Development_Kit) + + + +### JRE / Java Runtime Environment / Среда выполнения для Java + +JRE - это среда (программа), необходимая для запуска и выполнения программ, написанных на **java**. Она содержит только **виртуальную машину Java** для запуска программ и базовые библиотеки java-классов. В ней нет **компилятора** и средств для разработки. JRE полезна, если мы хотим только запустить готовую (уже скомпилированную) в **байт-код** программу. + +**Пример:** https://www.java.com/ru/download/ + +[*Подробнее >*](https://ru.wikipedia.org/wiki/Java_Runtime_Environment) + + + +### JVM / Java Virtual Machine / Виртуальная машина Java + +JVM - это среда выполнения (программа для выполнения) программ, написанных на Java и преобразованных (скомпилированных) в байт-код. +Ключевой особенностью языка Java является то, что его код сначала транслируется в специальный байт-код, независимый от операционной среды. А затем этот байт-код выполняется виртуальной машиной JVM (Java Virtual Machine), которая устанавливается на любую операционную среду. Эта особенность Java позволяет писать программы для разных операционных систем и для разных устройств. Т.е. один и тот же код будет работать на разных платформах (Windows, Linux, Mac OS и т.д.) без изменений, понадобится только своя версия виртуальной машины JVM. + +[*Подробнее >*](https://ru.wikipedia.org/wiki/Java_Virtual_Machine) + + + +I +=================== + +### IDE / Integrated Development Environment / Интегрированная среда разработки + +IDE — это единая среда разработки для создания приложения. Обычно IDE включает в себя: текстовый редактор, транслятор (компилятор и/или интерпретатор), средства автоматизации сборки, отладчик. Иногда содержит также средства для интеграции с системами управления версиями и другие инструменты. + +**Пример:** +Eclipse, NetBeans, IntelliJ IDEA. Инструкция по установке Intellij Idea: https://github.com/netology-code/guides/tree/master/intellij_idea + +[*Подробнее >*](https://ru.wikipedia.org/wiki/%D0%98%D0%BD%D1%82%D0%B5%D0%B3%D1%80%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%BD%D0%B0%D1%8F_%D1%81%D1%80%D0%B5%D0%B4%D0%B0_%D1%80%D0%B0%D0%B7%D1%80%D0%B0%D0%B1%D0%BE%D1%82%D0%BA%D0%B8) + + + +### If / Условный оператор if + +If — условный **оператор** (самый часто используемый). Он проверяет условие, указанное в качестве аргумента: `if (условие)`. Если результат вычисления условия верен, то программа продолжит выполнение кода, написанного внутри блока `{ код }`. Если результат не верен, то программа пропустит этот блок. Если нужно проверить несколько условий, к оператору `if` добавляется оператор `else` (иначе) и блок кода `{ код }`. Для проверки более чем одного условия операторы `if else` размещаются друг за другом. + +**Пример:** + +1.Если температура чайника достигла 100 градусов, выполни код (выключи его): + + if (temperatureTeapot == 100) { + // Код сработает, только если переменная temperatureTeapot = 100; + } + +2.Если температура чайника достигла 100 градусов, выполни код (выключи его). Если нет, то продолжай кипятить воду в нем. + + if (temperatureTeapot == 100) { + // Код в этом блоке сработает, только если переменная temperatureTeapot = 100; + } else { + // Код в этом блоке сработает, только если переменная temperatureTeapot не равна 1; + } + +*Подробнее в лекции:* +лекция “1.3 Условные операторы и циклы” из “Блок 1. Основы Java”. + + + + S + ======================= + +### Switch / Условный оператор switch + +Switch - условный **оператор**, который в качестве аргумента принимает переменную и сравнивает ее значение в инструкциях оператора `case`. Дополнительно оператор `switch` имеет инструкцию `default`, определяющую вариант по умолчанию (срабатывает в случае, если ни один из вариантов оператора `case` не совпал). + +**Пример:** в зависимости от температуры холодильника включите или отключите компрессор охлаждения в нем. + + switch (refrigeratorTemperature) { + case 0: + // Код в этом блоке сработает, только если переменная refrigeratorTemperature = 0; + break; + case -20: + // Код в этом блоке сработает, только если переменная refrigeratorTemperature = -20 + break; + default: + // Код в этом блоке сработает, если ни одно условие выше не оказалось верным; + } + +*Подробнее в лекции:* + лекция “1.3 Условные операторы и циклы” из “Блок 1. Основы Java”. + + + +W +======================= + +### While / Цикл "пока" / Цикл "до тех пор пока” / Цикл с предусловием + +While - оператор **цикла**, который повторяет блок кода, пока заданное условие является верным (его еще называют цикл "пока" или "до тех пор пока”). Используется, когда заранее неизвестно, сколько раз нужно что-то сделать, но при этом известны условия прекращения цикла (и эти условия должны проверяться строго до того, как выполнится код внутри цикла). Цикл проверяет условие до выполнения тела цикла, поэтому цикл while называется циклом с предусловием. Цикл имеет следующий синтаксис: + + while (условие) { + инструкция; + ... + инструкция; + // инструкции внутри фигурных скобок составляют тело цикла + } + +**Пример:** выведем на экран числа от 1 до 5 + + int i = 0; + while (i < 5) { + i = i + 1; + System.out.println(i); + +*Подробнее в лекции:* + +1. лекция “4 Циклы” из “Блок 0. Введение в Java (Basic Java BJAVA)”, +2. лекция “1.3 Условные операторы и циклы” из “Блок 1. Основы Java”. + + + +А +=============== + +### Абстрактные классы + +Абстрактные классы в программировании позволяют создать механизм, который позволял бы описать общие свойства объектов, реализовать одинаковые для всех методы так, чтобы разработчик классов-наследников мог реализовывать только отличающиеся части. Абстрактный класс, как и обычный, содержит поля и методы, но нельзя создать экземпляр абстрактного класса. Также в отличие от обычного класса, абстрактный может содержать методы без реализации (абстрактные). + +Абстрактные методы (могут быть только внутри абстрактного класса) не содержат реализации и обязательно должны быть переопределены в потомках. + +**Пример:** создание абстрактного класса геометрических фигур (класс обобщает свойства различных фигур): + + abstract class Figure { + private Color fillColor; + public Color(Color fillColor) { + this.fillColor = fillColor; + } + public Color getFillColor() { + return fillColor; + } + public abstract double getPerimeter(); + public abstract double getArea(); + } + +[*Подробнее >*](https://ru.wikipedia.org/wiki/%D0%90%D0%B1%D1%81%D1%82%D1%80%D0%B0%D0%BA%D1%82%D0%BD%D1%8B%D0%B9_%D0%BA%D0%BB%D0%B0%D1%81%D1%81) + +*Подробнее в лекции:* +лекция “3.4. Основы ООП - абстракции и интерфейсы” из “Блок 3. Основы ООП” + + + +Д +=================== + +### Двумерный массив + +Двумерный массив - это **массив**, в котором для определения местоположения элемента в массиве нужно указать значения двух **индексов**. Двумерный массив ассоциируется с таблицей. Если количество столбцов и строк массива (таблицы) одинаковое, то массив еще называют **матрицей**. + +При объявлении двумерного массива указываем тип, размеры и имя. Массив можно создать тремя способами: + +1) `тип имя_переменной[][] = new тип[размер][размер]`; +2) `тип[][] имя_переменной = new тип[размер][размер]`; +3) `тип[] имя_переменной[] = new тип[размер][размер]`; + +*тип* – базовый тип элементов массива; *размер* – число элементов массива. Элементы массива могут быть любого типа, допустимого в языке Java. Важный момент - размер созданного массива нельзя изменить. + +**Пример:** объявим двумерный строковый массив с именем products (размер массива 2x4) и заполним значениями: + + String products[][] = new String[2][4]; + products[0][0] = "Хлеб"; + products[0][1] = "ООО ГРУП"; + products[0][2] = "5 дней"; + products[0][3] = "мука"; + + products[1][0] = "Сметана"; + products[1][1] = "ИП Про"; + products[1][2] = "10 дней"; + products[1][3] = "молоко"; + +*Подробнее в лекции:* +лекция “2.2 Массивы многомерные” из “Блок 2. InMemory хранение данных — массивы”. + + + +И +================= + +### Индекс + +В программировании одно из значений индекса - это позиция элемента в **массиве** (начинается индекс с нуля). Индекс указывается в квадратных скобках `[ ]` после имени массива. + +**Пример:** создание массива с тремя целочисленными элементами и присвоение значения каждому из элементов: + + int[] array1 = new int[3]; + array1[0] = 5; + array1[1] = 17; + array1[2] = 350; + +*Подробнее в лекции:* +1. лекция “6 Массивы” из “Блок 0. Введение в Java (Basic Java BJAVA)”, +2. лекция “2.1 Массивы одномерные” из “Блок 2. InMemory хранение данных — массивы”. + + + +### Инициализация переменной + +Инициализация **переменной** означает присвоение начального значения переменной. Инициализация может происходить как одновременно с объявлением переменной, так и после. + +**Пример:** + + int number = 5 ; //создаем переменную с именем number с численным типом int и присваиваем ей значение 5 + + + +### Интерфейс (interface) объекта + +Интерфейс представляет собой внешнее описание **объекта** и описывается атрибутами и методами объекта, которые доступны для использования другими объектами. Конкретный интерфейс описывает поведение (набор методов) объекта, реализующего данный интерфейс (в отличие от класса, который может еще и хранить состояние). Реализация конкретного интерфейса некоторым классом говорит о том, что объекты этого класса можно использовать определенным образом. Это позволяет работать одинаково с объектами разных классов. + +В отличие от **абстрактных классов** интерфейсы описывают только поведение (методы), могут быть реализованы на абсолютно разных классах,при этом класс может реализовывать несколько интерфейсов. Механизм использования интерфейса решает проблему запрета (нежелательности) множественного наследования классов в объектно-ориентированном программировании. + +**Пример:** мы хотим добавить нашим объектам-фигурам возможность изменять масштаб: + + public interface Scalable { + public void scale(int factor); + } + +Теперь любой класс, реализующий интерфейс Scalable, обязан иметь метод scale. + +[*Подробнее >*](https://ru.wikipedia.org/wiki/%D0%98%D0%BD%D1%82%D0%B5%D1%80%D1%84%D0%B5%D0%B9%D1%81_(%D0%BE%D0%B1%D1%8A%D0%B5%D0%BA%D1%82%D0%BD%D0%BE-%D0%BE%D1%80%D0%B8%D0%B5%D0%BD%D1%82%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%BD%D0%BE%D0%B5_%D0%BF%D1%80%D0%BE%D0%B3%D1%80%D0%B0%D0%BC%D0%BC%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5)) + +*Подробнее в лекции:* +лекция “3.4. Основы ООП - абстракции и интерфейсы” из “Блок 3. Основы ООП” + + + +К +================== + +### Класс + +Класс - это специальная структура, c помощью которой описываются будущие **объекты** в java. Чтобы описать класс нужно: +1) создать файл с именем класса и расширением java; +2) внутри этого файла добавить специальный оператор `class` и "Имя файла". + +Класс может содержать в себе **поля** (характеристики объекта, или переменные внутри класса) и **методы** (функции, которые может выполнять объект). Названия классов в Java пишутся с большой буквы, а названия объектов — с маленькой. + +**Пример:** создание класса “музыкальная студия” с полями (название; владелец; год основания; количество выпущенных треков) и двумя методами (увеличения количества сделанных студией записей и смены названия студии на случай ребрендинга): + + class RecordStudio { + String label; + String owner; + int foundationYear; + int records; + + void makeNewRecord() { + records++; + } + + void setLabel(String newLabel) { + label = newlabel; + } + } + + +[*Подробнее >*](https://ru.wikipedia.org/wiki/%D0%9A%D0%BB%D0%B0%D1%81%D1%81_(%D0%BF%D1%80%D0%BE%D0%B3%D1%80%D0%B0%D0%BC%D0%BC%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5)) + +*Подробнее в лекции:* +1. лекция “5. Классы и объекты” из “Блок 0. Введение в Java (Basic Java BJAVA)”, +2. лекция “3.1 Структура класса” из “Блок 3. Основы ООП” + + +### Компилятор + +Компилятор - это программа (утилита), преобразующая файлы с исходным кодом (в языке java - это файлы с расширением java) в файлы, исполняемые компьютером (операционной системой). В экосистеме Java под компилятором понимается утилита, преобразующая программу, написанную программистом на java, в **байт-код**, исполняемый **виртуальной машиной Java**. + +**Пример:** **javac** - программа-компилятор, входящая в пакет **JDK**. + +[*Подробнее >*](https://ru.wikipedia.org/wiki/%D0%9A%D0%BE%D0%BC%D0%BF%D0%B8%D0%BB%D1%8F%D1%82%D0%BE%D1%80) + + +### Компиляция + +В программировании на **Java** под компиляцией понимается преобразование кода, написанного программистом на языке Java, в код, который понятен **виртуальной машине Java** (т.е. **байт-код**). + +[*Подробнее >*](https://ru.wikipedia.org/wiki/%D0%9A%D0%BE%D0%BC%D0%BF%D0%B8%D0%BB%D1%8F%D1%82%D0%BE%D1%80) + + +### Константа + +Константа - это имя, с которым связано некоторое постоянное значение (в отличие от **переменной** это значение единожды задаётся и потом уже не изменяется). Условно можно сказать, константы позволяют задать такие “переменные”, которым можно присвоить значение только один раз и потом это значение нельзя изменить. Константа объявляется также как и переменная, только вначале идет ключевое слово final. Как правило, константы имеют имена в верхнем регистре. + +**Пример:** + + final int LIMIT_IN_ATM = 5; + +*Подробнее в лекциях:* +лекция “2 Переменные и типы данных” из “Блок 0. Введение в Java (Basic Java BJAVA)”. + + +### Консоль / терминал + +В широком смысле консоль - это совокупность устройств (в том числе устройств ввода-вывода), обеспечивающая взаимодействие человека-оператора с компьютером. В современной лексике программирования под консолью понимается специальное “окно” для вывода системных сообщений и выполнения команд (другое название - интерфейс командной строки). Часто используется как синоним понятия **“терминал”**. + +[*Подробнее >*](https://ru.wikipedia.org/wiki/%D0%98%D0%BD%D1%82%D0%B5%D1%80%D1%84%D0%B5%D0%B9%D1%81_%D0%BA%D0%BE%D0%BC%D0%B0%D0%BD%D0%B4%D0%BD%D0%BE%D0%B9_%D1%81%D1%82%D1%80%D0%BE%D0%BA%D0%B8) + + +### Конструктор класса / конструктор + +Конструктор - это специальный **метод** **класса**, который ничего не возвращает, но описывает то, каким образом должен быть собран/инициализирован новый **объект** (экземпляр класса), например, какие должны быть значения **полей** у только что созданного объекта. Без вызова конструктора невозможно создать экземпляр данного класса. Конструкторы выполняют инициализацию объекта, то есть создание нового экземпляра класса, подставляя значения из аргументов конструктора. Конструкторов у класса может быть сколько угодно.Если в классе не определено ни одного конструктора, то для этого класса компилятором автоматически создается конструктор без параметров (т.е. все поля, если они не примитивные значения, примут значения `null`). + +Конструкторы должны иметь тоже имя, что и класс. Чтобы внутри метода отличить параметр конструктора от поля, если они имеют одинаковые наименования, используется this - ссылка на объект. + +**Пример:** создание класса с описанием клиента и двумя конструкторами: + + public class Client { + String name; // имя + String surname; // фамилия + String dateOfBirth; // дата рождения + String passportId; // номер паспорта + String PIN; // PIN-код для карты + + //конструктор класса с двумя параметрами + Client (String name, String surname) { + this.name = name; + this.surname = surname; + } + + //конструктор класса с тремя параметрами + Client (String name, String surname, String passportId) { + this.name = name; + this.surname = surname; + this.passportId = passportId; + } + ... //программный код с описанием методов класса + } + +[*Подробнее >*](https://ru.wikipedia.org/wiki/%D0%9A%D0%BE%D0%BD%D1%81%D1%82%D1%80%D1%83%D0%BA%D1%82%D0%BE%D1%80_(%D0%BE%D0%B1%D1%8A%D0%B5%D0%BA%D1%82%D0%BD%D0%BE-%D0%BE%D1%80%D0%B8%D0%B5%D0%BD%D1%82%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%BD%D0%BE%D0%B5_%D0%BF%D1%80%D0%BE%D0%B3%D1%80%D0%B0%D0%BC%D0%BC%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5)) + +*Подробнее в лекции:* +1. лекция “5. Классы и объекты” из “Блок 0. Введение в Java (Basic Java BJAVA)”, +2. лекция “3.1 Структура класса” из “Блок 3. Основы ООП” + + +М +==================== + +### Массив + +В программировании массив – это ссылочный тип данных, представляющий собой набор элементов (переменных) одного типа. Элементы массива могут быть любого типа, допустимого в языке Java. Для объявление массива надо указать тип, размер и имя. Массив можно создать двумя способами: +1) `тип имя_переменной[] = new тип[размер]`; +2) `тип[] имя_переменной = new тип[размер]`; + +*Тип* – базовый тип элементов массива; *размер* – число элементов массива (выделение памяти для элементов). Элементы массива могут быть любого типа, допустимого в языке Java. + +**Пример:** Предположим, у нас есть список цен на товары, определим массив типа int и дадим размер массиву (например у нас список из 5 цен): + + int[] prices = new int [5]; + +[*Подробнее >*](https://ru.wikipedia.org/wiki/%D0%9C%D0%B0%D1%81%D1%81%D0%B8%D0%B2_(%D1%82%D0%B8%D0%BF_%D0%B4%D0%B0%D0%BD%D0%BD%D1%8B%D1%85)) + +*Подробнее в лекции:* +1. лекция “6 Массивы” из “Блок 0. Введение в Java (Basic Java BJAVA)”, +2. лекция “2.1 Массивы одномерные” из “Блок 2. InMemory хранение данных — массивы”. + + +### Матрица + +Матрица - это **двумерный массив**, в котором количество столбцов и строк массива (таблицы) одинаковое. + +*Подробнее в лекции:* + лекция “2.2 Массивы многомерные” из “Блок 2. InMemory хранение данных — массивы”. + + +### Методы + +Методы - это “действия” (функции), которые может выполнять **объект**. Методы существуют в виде процедур и функций, которые должны находиться в описании **класса**. Методы предоставляют интерфейс, при помощи которого осуществляется доступ к данным объекта некоторого класса. С практической точки зрения методы нужны для разделения программного кода на логические части, они позволяют быстрей читать, дорабатывать и документировать код. + +Для того чтобы описать метод, нужно объявить: +- *тип возвращаемого значения* (или ключевое слово `void`, которое “говорит”, что метод ничего не возвращает); +- *имя метода*; +- в круглых скобках передаются *входные параметры метода* (в случае, если их нет, в скобках пусто); +- *тело метода* описывается так же как и класс в фигурных скобках `{...}`. + +**Пример:** в классе `RecordStudio` описан метод `makeNewRecord`, который позволяет увеличить количество сделанных студией записей (количество записей хранится в поле `records`): + + class RecordStudio { + String label; + String owner; + int foundationYear; + int records; + + void makeNewRecord() { + records++; + } + } + +[*Подробнее >*](https://ru.wikipedia.org/wiki/%D0%9C%D0%B5%D1%82%D0%BE%D0%B4_(%D0%BF%D1%80%D0%BE%D0%B3%D1%80%D0%B0%D0%BC%D0%BC%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5)) + +*Подробнее в лекции:* +1. лекция “5. Классы и объекты” из “Блок 0. Введение в Java (Basic Java BJAVA)”, +2. лекция “3.1 Структура класса” из “Блок 3. Основы ООП” + + +### Многомерный массив + +Многомерный массив - **массив**, в котором для определения местоположения элемента в массиве нужно указать значения трех и больше **индексов**. С многомерными массивами можно работать так же, как и с **двумерными**, но только учитывая количество индексов. + +*Подробнее в лекции:* + лекция “2.2 Массивы многомерные” из “Блок 2. InMemory хранение данных — массивы”. + + +### Модификаторы доступа + +Модификаторы доступа - это ключевые слова, которые пишутся перед названиями **переменных**, **методов** и даже **классов**.В Java используются следующие модификаторы доступа: +- `public`: публичный, общедоступный класс или член класса. Поля и методы, объявленные с модификатором public, видны другим классам из текущего пакета и из внешних пакетов. +- `private`: закрытый класс или член класса, противоположность модификатору public. Закрытый класс или член класса доступен только из кода в том же классе. +- `protected`: такой класс или член класса доступен из любого места в текущем классе или пакете или в классах-наследниках, даже если они находятся в других пакетах +- `static`: Если указать static перед методом класса, он также будет принадлежать создаваемому классу - это значит, что при вызове таких методов не требуется создание объекта. +- `default`: модификатор по умолчанию. Когда мы не пишем модификатора доступа, он по умолчанию имеет значение default. Такие поля или методы видны всем классам в текущем пакете. + +*Подробнее в лекции:* +лекция “3.2 Модификаторы доступа, наследование” из “Блок 3. Основы ООП” + + +О +=================== + +### Обертки над примитивами / классы-обертки / классы-оболочки + +Класс-обертка - это аналог **ссылочного типа** для каждого **примитивного типа данных**. Другое название этого вида классов - классы-оболочки (wrappers). Такие классы нужны для расширения функционала примитивных типов, например, для преобразования строки в число. + +**Пример:** + + примитивный тип - класс-обертка: + short - Short, + byte - Byte, + int - Integer, + long - Long, + float - Float, + double - Double, + char - Character, + boolean - Boolean + +[*Подробнее >*](https://ru.wikipedia.org/wiki/%D0%9E%D0%B1%D1%91%D1%80%D1%82%D0%BA%D0%B0_(%D1%82%D0%B8%D0%BF_%D0%B4%D0%B0%D0%BD%D0%BD%D1%8B%D1%85)) + + +### Объект + +Объект в программировании — это сущность, способная сохранять свое состояние (информацию) и обеспечивающая набор операций (поведение) для проверки и изменения этого состояния. То есть простыми словами, все элементы, с которыми вы будете работать в программном коде, будут объектами. Объект — это модель реальной сущности в программной системе, потому что программные системы предназначены для моделирования реальных систем. Объекты создаются из **классов** с помощью **конструкторов**.Для того, чтобы создать новый объект из класса в java используется **оператор** new. Вызов **метода** на экземпляре класса происходит через символ точки ('.') по следующей схеме: `имяОбъекта.название метода (<параметры если есть>)` + +**Пример:** создание объекта класса `RecordStudio` с одновременным заполнением полей этого класса (название, собственник, год основания, количество записей): + + RecordStudio captainRecords = new RecordStudio("Captain Records", "Unkown", 2010, 131235); + +[*Подробнее >*](https://ru.wikipedia.org/wiki/%D0%9E%D0%B1%D1%8A%D0%B5%D0%BA%D1%82_(%D0%BF%D1%80%D0%BE%D0%B3%D1%80%D0%B0%D0%BC%D0%BC%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5)) + +*Подробнее в лекции:* +1. лекция “5. Классы и объекты” из “Блок 0. Введение в Java (Basic Java BJAVA)”, +2. лекция “3.1 Структура класса” из “Блок 3. Основы ООП” + + +### Оператор + +Оператор - это некоторая команда в языке программирования (иногда оператор называют “инструкцией”). Оператор является наименьшей автономной часть языка программирования. + +**Пример:** условный оператор **if**, оператор цикла **for**. + + +П +===================== + +### Пакеты классов + +Пакеты классов – это папки, в которых хранятся классы одного модуля программы. Пакеты - это простой способ хранения классов по категориям. Существуют пакеты уже готовых классов Java. Для использования классов определенного пакета в своей программе его нужно импортировать в программу командой `import` и указанием имени пакета классов. Имя пакета объявляется в самом начале исходного файла программы. + +**Пример:*** +- java.io - пакет классов для операций ввода-вывода; +- java.sql - пакет для использования соединений к базе данных. + +[*Подробнее >*](https://ru.wikipedia.org/wiki/Package_(Java)) + +*Подробнее в лекциях:* +лекция “1.2 Структура программы” из “Блок 1. Основы Java”. + + +### Переменная + +В Java переменная — это имя, с которым связано некоторое значение. Можно провести аналогию с контейнером (коробкой), в котором может храниться значение для дальнейшего использования в программе. Т.е. можно сравнить переменную с коробкой, в которой хранится какой-то предмет (в случае с программированием данный предмет — это *значение переменной*). Коробка может иметь надпись (*имя переменной*). А также для разных видов вещей могут использоваться разные виды коробок (вид коробки — *тип переменной*). + +В java для создания (объявления) переменной используем команду, включающую тип переменной и имя переменной. В качестве типа переменной нужно выбрать один из уже существующих в языке java типов данных (примитивный или ссылочный). Имя переменной придумываем сами: обычно это существительное, которое пишется маленькими латинскими буквами .Если имя переменной состоит из двух слов, то пишется слитно и как бы “горбиками” как у верблюда. + +**Пример:** + + int number; //создаем переменную с именем number с численным типом int + int amountOfBooks; //создаем переменную с именем amountOfBooks с численным типом int + +[*Подробнее >*](https://ru.wikipedia.org/wiki/%D0%9F%D0%B5%D1%80%D0%B5%D0%BC%D0%B5%D0%BD%D0%BD%D0%B0%D1%8F_(%D0%BF%D1%80%D0%BE%D0%B3%D1%80%D0%B0%D0%BC%D0%BC%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5)) + +*Подробнее в лекциях:* +лекция “2 Переменные и типы данных” из “Блок 0. Введение в Java (Basic Java BJAVA)”. + + +### Поля + +Поля представляют собой **переменные**, которые нужны для хранения, изменения и использования значений внутри **класса**. При создании класса поля - это объявление характеристик **объекта**. В java для создания (объявления) поля (переменной) используем команду, включающую тип переменной и имя переменной. + +**Пример:** создание класса “музыкальная студия” со следующими полями: название; владелец; год основания; количество выпущенных треков + + class RecordStudio { + String name; + String owner; + int foundationYear; + int records; + } + +[*Подробнее >*](https://ru.wikipedia.org/wiki/%D0%9F%D0%BE%D0%BB%D0%B5_%D0%BA%D0%BB%D0%B0%D1%81%D1%81%D0%B0) + +*Подробнее в лекции:* +1. лекция “5. Классы и объекты” из “Блок 0. Введение в Java (Basic Java BJAVA)”, +2. лекция “3.1 Структура класса” из “Блок 3. Основы ООП” + + +### Примитивные типы данных / Primitive Data Types + +Примитивные типы данных - это типы данных, которые предоставляются языком программирования как базовая встроенная единица языка. В языке java они бывают четырех видов: целочисленный, вещественный, символьный, булевый. + +Таблица примитивных типов данных в языке Java: + +Целочисленные: + +1. byte (целые числа, 1 байт, -128 до 127) +2. short (целые числа, 2 байта, -32768 до 32767) +3. int (целые числа, 4 байта, -2147483648 до 2147483647) +4. long (целые числа, 8 байт, -9223372036854775808 до 9223372036854775807) + +Вещественные: + +5. float (вещественные числа, 4 байта, -3.4E+38 до 3,4E+38) +6. double (вещественные числа, 8 байт, -1.7E+308 до 1.7E+308) + +Другие: + +7. boolean (значение истина/ложь, 1 байт, true/false) +8. char (символ Unicode, 2 байта, 1 Unicode символ) + +*Подробнее в лекциях:* + лекция 1.4 Типы данных в Java: примитивы из Блок 1. Основы Java + + +С +====================== + +### Сигнатура метода + +Сигнатура метода - это имя метода плюс параметры (причем порядок параметров имеет значение). + +**Пример:** + + public static void main(String[] args). + + +### Ссылочные типы данных / Reference Types + +Ссылочные типы данных - это типы данных, которые описываются в отдельных классах (и отдельных java-файлах). Самым часто используемым классом практически любого языка являются строки. В Java они представлены классом String . + +*Подробнее в лекциях:* +лекция “1.5 Типы данных в Java: объекты” из “Блок 1. Основы Java” + + +Т +======================= + +### Терминал + +Терминал - специальная программа для запуска и выполнения команд операционной системы или других программ. Часто используется как синоним понятия **“консоль”**. + +**Пример:** cmd (стандартный терминал в windows), terminal (в linux ), iterm (в macos). + + +### Тернарный оператор + +Тернарный оператор - это условный **оператор** без тела кода. Он используется, когда нужно присвоить значение переменной или вернуть значение из метода, не создавая избыточный код (альтернатива условному оператору **if**). Синтаксически конструкция состоит из условия `( условие )` и двух выражений. Выражения от условия отделены знаком вопроса `?`. Между выражениями стоит знак двоеточия `:` . Первое выражение сработает, если условие верно, а второе — если ложно. + +**Пример:** + + int switchOnRefrigiratorEngine = (refrigeratorTemperature >= 0) ? 1 : 0; + +[*Подробнее >*](https://javahelp.online/osnovy/ternarnyy-operator-java) + +*Подробнее в лекциях:* +лекция 1.3 Условные операторы и циклы из “Блок 1. Основы Java”. + + +Ц +======================= + +### Цикл + +Цикл — это какое-то повторяющееся действие или набор действий, которые выполняются до тех пор пока не выполнится условие прекращения выполнений (т.е. “выхода из цикла”). Набор повторяющихся в цикле действий называется *“телом цикла”*. Одно повторение входящих в цикл действий называется *«итерация»*. + +В java циклы бывают нескольких видов: **for**, **foreach**, **while**, **do while**. + +[*Подробнее >*](https://ru.wikipedia.org/wiki/%D0%A6%D0%B8%D0%BA%D0%BB_(%D0%BF%D1%80%D0%BE%D0%B3%D1%80%D0%B0%D0%BC%D0%BC%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5)) + +*Подробнее в лекциях:* +1. лекция 4 (Циклы) из “Блок 0. Введение в Java (Basic Java BJAVA)”, +2. лекция 1.3 Условные операторы и циклы из “Блок 1. Основы Java”. diff --git a/list/4.1.1/README.md b/list/4.1.1/README.md new file mode 100644 index 0000000..90796e6 --- /dev/null +++ b/list/4.1.1/README.md @@ -0,0 +1,55 @@ +# Домашнее задание к занятию 4.1 Коллекции List +## Задача 1. Записная книга + +### Описание +Напишем программу, представляющую собой менеджер списка дел. Списки дел можно хранить в массивах и списках. Массивы имеют фиксированную длину, и после того как массив создан, он не может расти или уменьшаться. `ArrayList` (одна из имплементаций списка) может менять свой размер во время исполнения программы, при этом необязательно указывать размерность при создании объекта. Кроме того, вы без проблем можете вставить новый элемент в середину коллекции, а также спокойно удалить элемент из любого места. Поэтому очень удобно использовать `List` для ведения списка дел, ведь часто бывает, что нужно добавить какие-то дела в середине дня или же что-то удалить. + +### Функционал программы +1. Запрос списка задач/дел у пользователя; +2. Возможность добавить задачу в список; +2. Возможность удалить задачу из списка; +3. Возможность вывода всех задач с их номерами (для пользователя нумеровать с 1). + +### Пример +``` +Выберите действие: +1. Добавить задачу +2. Вывести список задач +3. Удалить задачу +0. Выход +1 +Введите задачу для планирования: +Почитать про ArrayList + +Выберите действие: +1. Добавить задачу +2. Вывести список задач +3. Удалить задачу +0. Выход +1 +Введите задачу для планирования: +Повторить примитивные типы данных + +Выберите действие: +1. Добавить задачу +2. Вывести список задач +3. Удалить задачу +0. Выход +2 +Список задач: +1. Почитать про ArrayList +2. Повторить примитивные типы данных + +Выберите действие: +1. Добавить задачу +2. Вывести список задач +3. Удалить задачу +0. Выход +0 +``` + +### Процесс реализации +1. Создать объект имплементирующей `List` стандартной коллекции со значениями типа `String` для хранения списка дел +1. Используя `Scanner scanner = new Scanner(System.in)`, в бесконечном цикле необходимо выводить меню, считывать операцию и сопутствующие ей данные +1. Реализуйте операции над списком задач через методы коллекций. +1. Для удаления элемента списка по индексу используйте `remove(int index)`, не перепутайте его с `remove(T e)` (где `T` это тип элементов списка), который удаляет ячейку в которой лежит элемент `e`. diff --git a/list/README.md b/list/README.md new file mode 100644 index 0000000..000c83d --- /dev/null +++ b/list/README.md @@ -0,0 +1,29 @@ +# Домашнее задание к занятию 4.1 Коллекции List + +Необходимо выполнить и предоставить на проверку следующую задачу: + +[1. Записная книга](4.1.1); + +======= + +Задачи со звездочкой `*` необязательны для получения зачета. +Если вы хотите прислать дополнительное задание позже, напишите об этом при сдаче домашнего задания в личном кабинете на сайте [netology.ru](https://netology.ru). + +Любые вопросы по решению задач задавайте в чате учебной группы (ссылку вы найдете в письме на вашей эл. почте). + + +## Инструкция по выполнению домашнего задания + +1. Пишите код в IDE (рекомендуем [Intellij Idea](https://www.jetbrains.com/idea/download/), версия Community). + 1. Почему лучше работать в IDE? — Ускоряет работу, есть подсветка ошибок, отладка по шагам. + 1. Почему Intellij Idea? — Родитель Android Studio, бесплатная, умная. +2. Опирайтесь на принятый [стиль оформления кода](https://github.com/netology-code/codestyle/blob/master/java/README.md). +3. Готовый код сдаем в Repl.it. Для этого зарегистрируйтесь на сайте [Repl.IT](http://repl.it/). +4. Перейдите в раздел **my repls**. +5. Нажмите кнопку **Start coding now!**, если приступаете впервые, или **New Repl**, если у вас уже есть работы. +6. В списке языков выберите `Java`. +7. Убедитесь, что на сайте всё работает так же, как и у вас на компьютере, нажав на кнопку **Run**. Результат появится в правой части окна. +8. После окончания работы скопируйте ссылку на ваш repl в адресной строке браузера. +9. В личном кабинете на сайте [netology.ru](http://netology.ru/) в поле комментария к домашней работе вставьте скопированную ссылку и отправьте работу на проверку. + +*Никаких файлов прикреплять не нужно.* diff --git a/polymorphism/3.2.1/README.md b/polymorphism/3.2.1/README.md new file mode 100644 index 0000000..d2c405c --- /dev/null +++ b/polymorphism/3.2.1/README.md @@ -0,0 +1,95 @@ +## Задача 1. Игра-шутер + +### Описание +Один из проектов — это игра-шутер (~~Half-Life 3, только никому ни слова~~). +У игрока должна быть возможность использовать разные виды оружия, в будущем в игру могут быть добавлены новые. +Необходимо спроектировать иерархию классов, а также систему слотов для оружия у игрока. + +### Функционал программы +1. Создание объекта Player у которого будет набор оружия; +2. Возможность у игрока вызвать метод выстрела, внутри которого будут проверки на допустимость номера оружия для выстрела; +3. Классы оружия должны быть в пакете `weapon` (вспомните какие ДВЕ вещи нужно сделать, чтобы поместить классы в пакеты; мы их проходили на втором занятии); +4. Возможность выбора оружия для выстрела в main. + +### Процесс реализации + +1. Создадим класс игрока и функцию main. + +* Класс Player содержит список оружия и метод "_выстрелить_" +```java +class Player { + // Указываем тип данных Weapon, который будет храниться в "слотах игрока" + private Weapon[] weaponSlots; + + public Player() { + // Снаряжаем нашего игрока + weaponSlots = new Weapon[] { + // TODO заполнить слоты оружием + // new BigGun(), + // new WaterPistol() + }; + } + + public int getSlotsCount() { + // length - позволяет узнать, сколько всего слотов с оружием у игрока + return weaponSlots.length; + } + + public void shotWithWeapon(int slot) { + // TODO проверить на выход за границы + // если значение slot некорректно, то + // выйти из метода написав об этом в консоль + + // Получаем оружие из выбранного слота + Weapon weapon = weaponSlots[slot]; + // Огонь! + weapon.shot(); + } +} +``` + +* Метод `main` +```java +public static void main(String[] args) { + Scanner scanner = new Scanner(System.in); + Player player = new Player(); + // Как настоящие программисты мы имеем в виду, что исчисление начинается с 0 + System.out.format("У игрока %d слотов с оружием," + + " введите номер, чтобы выстрелить," + + " -1 чтобы выйти%n", + player.getSlotsCount() + ); + int slot; + + // TODO главный цикл игры: + // запрашивать номер с клавиатуры + // с помощью scanner.nextInt(), + // пока не будет введено -1 + + System.out.println("Game over!"); +} +``` + +2. Создадим классы для некоторых видов оружия. +* Базовый класс для всех видов оружия +```java +class Weapon { + public void shot() { + // TODO override me! + } +} +``` + +> Как "заставить" дочерний класс переопределить поведение некоторых методов базового класса, мы узнаем на следующей лекции. + +* Создадим дочерние классы: + * Пистолет; + * Автомат; + * РПГ; + * Рогатка; + * Водный пистолет. + +* В каждом из дочерних классов переопределите метод `shot()`, чтобы он изменил поведение оружия в соответствии с его типом. Например, чтобы оно выводило в консоль соответствующие выстрелу звуки: `Пив-Пав!`. + +3. Теперь можно вернуться к классу `Player` и создать по экземпляру каждого оружия. +4. Не забудьте разграничить классы по типу с помощью пакетов, например, все классы с оружием можно вынести в package `weapon`. diff --git a/polymorphism/3.2.2/README.md b/polymorphism/3.2.2/README.md new file mode 100644 index 0000000..9d3a33f --- /dev/null +++ b/polymorphism/3.2.2/README.md @@ -0,0 +1,111 @@ +## Задача 2. Задача от бухгалтеров + +### Описание +Следующая задача пришла от наших бухгалтеров. +Бухгалтерская программа должна уметь проводить операции c различными агентами, как c физическими/юридическими лицами, так и с иностранными компаниями: чп, ип, ооо, зао, ~~иклмн~~, ~~ёпрст~~. +С некоторых операций налог платить не нужно, некоторые облагаются подоходным налогом, с некоторых необходимо уплатить НДС. +Необходимо расширить функциональность класса `Bill` возможностью работы с различными системами налогообложения. + +### Дополнительная информация +Практически в любом языке программирования, если вы напишете нечто подобное, вы получите не то, что вы могли ожидать: +```java +System.out.println(0.1 + 0.2); // => 0.30000000000000004 +``` +Связанно это с тем, что числа в компьютере хранятся в двоичном виде, и **конечные** дроби в десятичной системе счисления `0.1` и `0.2` превращаются в **бесконечные периодические** дроби в двоичной системе счисления `0.00011001100110011010` и `0.00110011001100110011` соответственно. +Как следствие, часть числа теряется, а значит, и точность при операциях с ними. +Подробнее про представление вещественных чисел в компьютере [на сайте ИТМО](https://neerc.ifmo.ru/wiki/index.php?title=%D0%9F%D1%80%D0%B5%D0%B4%D1%81%D1%82%D0%B0%D0%B2%D0%BB%D0%B5%D0%BD%D0%B8%D0%B5_%D0%B2%D0%B5%D1%89%D0%B5%D1%81%D1%82%D0%B2%D0%B5%D0%BD%D0%BD%D1%8B%D1%85_%D1%87%D0%B8%D1%81%D0%B5%D0%BB). + +Для того чтобы производить расчёты с десятичными дробными числами, существует специальный класс `BigDecimal` (большое десятичное). Большое, потому что у него нет стандартных ограничений как у `double (-1.7E+308 до 1.7E+308)` или `int (-2147483648 до 2147483647)`. +Этот класс может хранить число, состоящее из 2,147,483,647 цифр, ~~Карл~~! А десятичное, потому что каждая цифра числа хранится по отдельности, из-за чего не возникает проблем с потерями при переводе между системами счисления. +В задаче предлагается принять некоторые неточности и использовать уже знакомый нам тип double. Плюсиком будет решение задачи `№ 2*` (со звёздочкой). + +### Функционал программы + +→ Создание нескольких счетов и расчет налогов для них. + +### Процесс реализации +1. Класс `Bill` + +В системе уже есть класс `Bill`, в который мы добавили поле `TaxType taxType;` и метод `payTaxes()`: + +```java +class Bill { + private double amount; + private TaxType taxType; + private TaxService taxService; + + public Bill(double amount, TaxType taxType, TaxService taxService) { + this.amount = amount; + this.taxType = taxType; + this.taxService = taxService; + } + + public void payTaxes() { + // TODO вместо 0.0 посчитать размер налога исходя из TaxType + double taxAmount = 0.0; + + taxService.payOut(taxAmount); + } +} +``` + +А также класс налоговой службы: +```java +class TaxService { + public void payOut(double taxAmount) { + System.out.format("Уплачен налог в размере %.2f%n", taxAmount); + } +} +``` + +2. Создадим классы для различных типов налогообложения. +* Базовый класс +```java +class TaxType { + public double calculateTaxFor(double amount) { + // TODO override me! + return 0.0; + } +} +``` +* Классы, расширяющие `TaxType`: + * Подоходный налог, = 13% (`IncomeTaxType`) + * НДС, = 18% (`VATaxType`) + * Прогрессивный налог, до 100 тысяч = 10%, больше 100 тысяч = 15% (`ProgressiveTaxType`) + +3. В методе `main` создадим несколько счетов и оплатим с них налоги в налоговую службу. + +```java +public static void main(String[] args) { + TaxService taxService = new TaxService(); + Bill[] payments = new Bill[] { + // TODO создать платежи с различным типами налогообложения + }; + for (int i = 0; i < payments.length; ++i) { + Bill bill = payments[i]; + bill.payTaxes(); + } +} +``` + +## Задача 2* + +Здесь необходимо реализовать тот же функционал, но используя вместо double –> BigDecimal. + +Работа с ним может показаться необычной и странной. Например, их нельзя сложить, используя оператор `+` (в Java запрещено перегружать операторы), или сравнить с помощью `==` (так как это объект, произойдёт сравнение ссылок, а не значений объектов). Вместо этого мы должны использовать методы `.add(…)` и `.compareTo(…)` соответственно. + +Экземпляр этого класса можно создать с помощью `new BigDecimal("0.1")` или `BigDecimal.valueOf(0.2)`. +Как и `String`, экземпляры этого класса неизменяемые (иммутабельные), а методы `.add(…)`, `.multiply(…)` возвращают новый объект, содержащий результат операции. + +Например, чтобы сложить 0.1 рубля и 0.2 рубля и получить ожидаемые 30 копеек, мы могли бы написать код: + +```java +BigDecimal first = new BigDecimal("0.10"); +BigDecimal second = BigDecimal.valueOf(0.2); + +BigDecimal sum = first.add(second); + +System.out.println(sum.toString()); // => 0.30 +``` + +При делении BigDecimal нужно обязательно указывать способ округления результата. Про способы округления чисел в `BigDecimal` можно почитать [например, тут](http://developer.alexanderklimov.ru/android/java/bigdecimal.php). diff --git a/polymorphism/README.md b/polymorphism/README.md new file mode 100644 index 0000000..d524118 --- /dev/null +++ b/polymorphism/README.md @@ -0,0 +1,34 @@ +# Домашнее задание к занятию 3.2 Основы ООП: полиморфизм + +Пока мы занимались нашим Task Manager'ом, в нём уже успели накопиться задачки по нескольким проектам от заказчиков. + +Необходимо выполнить и предоставить на проверку следующие задачи: + +1. [Игра-шутер](3.2.1); + +Дополнительная задача со * : + +2. [Задача от бухгалтеров](3.2.2); + +======= + +Задачи со звездочкой `*` необязательны для получения зачета. +Если вы хотите прислать дополнительное задание позже, напишите об этом при сдаче домашнего задания в личном кабинете на сайте [netology.ru](https://netology.ru). + +Любые вопросы по решению задач задавайте в чате учебной группы (ссылку вы найдете в письме на вашей эл. почте). + +## Инструкция по выполнению домашнего задания + +1. Пишите код в IDE (рекомендуем [Intellij Idea](https://www.jetbrains.com/idea/download/), версия Community). + 1. Почему лучше работать в IDE? — Ускоряет работу, есть подсветка ошибок, отладка по шагам. + 1. Почему Intellij Idea? — Родитель Android Studio, бесплатная, умная. +2. Опирайтесь на принятый [стиль оформления кода](https://github.com/netology-code/codestyle/blob/master/java/README.md). +3. Готовый код сдаем в Repl.it. Для этого зарегистрируйтесь на сайте [Repl.IT](http://repl.it/). +4. Перейдите в раздел **my repls**. +5. Нажмите кнопку **Start coding now!**, если приступаете впервые, или **New Repl**, если у вас уже есть работы. +6. В списке языков выберите `Java`. +7. Убедитесь, что на сайте всё работает так же, как и у вас на компьютере, нажав на кнопку **Run**. Результат появится в правой части окна. +8. После окончания работы скопируйте ссылку на ваш repl в адресной строке браузера. +9. В личном кабинете на сайте [netology.ru](http://netology.ru/) в поле комментария к домашней работе вставьте скопированную ссылку и отправьте работу на проверку. + +*Никаких файлов прикреплять не нужно.* diff --git a/queue/4.2.1/README.md b/queue/4.2.1/README.md new file mode 100644 index 0000000..65e144e --- /dev/null +++ b/queue/4.2.1/README.md @@ -0,0 +1,79 @@ +# Домашнее задание к занятию 4.2. Коллекции. Очередь. +## Задача 1. Лифт + +### Описание +Сегодня мы будем реализовывать программу для работы лифта 25-и этажного дома. +Нужно написать программу, которая считывает данные из консоли, ожидая ввода номера этажа. После ввода каждого числа (номера этажа) добавляет значение в очередь дальнейшего перемещения лифта. +Как только пользователь введет 0, программа должна последовательно вывести список всех этажей, на которых лифт делал остановки, в формате: "этаж 1 -> этаж 22 -> этаж 0". +Если пользователь ввел этаж вне диапазона 0-25, проигнорировать ввод таких данных. +Для реализации хранения введенных пользователем этажей отлично подойдет структура на основе интерфейса очередь (queue). По мере ввода мы сможем добавлять в конец очереди новые значения. + +### Функционал программы +1. Ввод номеров этажей +2. Вывод информации о посещенных этажах в порядке добавления в формате: "этаж 1 -> этаж 22 -> этаж 0". + +### Пример +``` +Ожидаю ввода этажа: (для завершения введите 0) +5 +Ожидаю ввода этажа: (для завершения введите 0) +12 +Ожидаю ввода этажа: (для завершения введите 0) +38 +Такого этажа нет в доме +Ожидаю ввода этажа: (для завершения введите 0) +0 +Лифт проследовал по следующим этажам: +этаж 5 -> этаж 12 - этаж 0 +``` + +### Процесс реализации + +1. В бесконечном цикле считывать номера этажей до тех пор, пока не будет введен нулевой этаж. +2. Перед каждым вводом запросить номер следующего этажа - вывести сообщение "Ожидаю ввода этажа: (для завершения введите 0)", чтобы пользователь понимал, что ему вводить. +3. Добавить проверку: если введенный этаж входит в диапазон допустимых значений 0-25, продолжить работу программы; а если не входит, то вывести на экран сообщение: "Такого этажа нет в доме". +4. Добавить проверку: если введенный этаж = 0, нужно выйти из цикла "чтение данных из консоли". +5. Если введенный этаж входит в диапазон 0-25, то нужно добавить значение в очередь и запросить ввод данных повторно. +6. Для вывода информации на экран, используя метод интерфейса `Queue poll`, прочитать последовательно все значения и вывести на экран. + +### * Дополнительное задание: рассчитать время движения лифта. + +После ввода нулевого этажа, программа должна рассчитать время движения лифта вместе с остановками. Скорость движения лифта между парой этажей равна 5 секунд, время остановки на открытие и закрытие дверей лифта 10 секунд. Вывести информацию, сколько времени потребовалось лифту, чтобы пройти ранее введенные этажи. + +### Процесс реализации + +1. Перед циклом вывода результата работы лифта нужно добавить несколько переменных: +`int waitDoorsInSeconds = 10` - количество секунд, которое потребуется на закрытие/открытие дверей; +`int waitMoveInSeconds = 5` - количество секунд, затрачиваемое лифтом на движение между этажами; +`int totalSeconds = 0` - всего потрачено времени на движение и остановки лифтом; +`int previousFloor = -1` - переменная для хранения предыдущей остановки. + +2. В цикле проверяем, если `previousFloor` не равен `-1`, вычисляем разницу между текущим этажем и предыдущим и с +помощью метода `Math.abs` найдем абсолютное значение (уберем знак) и умножим на время движения: +`totalSeconds += Math.abs(currentFloor - previousFloor) * waitMoveInSeconds` + +3. Добавим время открытия/закрытия дверей к `totalSeconds`: +`totalSeconds += waitDoorsInSeconds` + +4. После выхода из цикла выведем значение переменной `totalSeconds` на экран. +`System.out.println("Время затраченное лифтом на маршрут =: " + totalSeconds + " с.")`. + +5. Завершим работу программы. + +## Инструкция по выполнению домашнего задания + +1. Зарегистрируйтесь на сайте [Repl.IT](http://repl.it/). +2. Перейдите в раздел **my repls**. +3. Нажмите кнопку **Start coding now!**, если приступаете впервые, или **New Repl**, если у вас уже есть работы. +4. В списке языков выберите `Java`. +5. Код пишите в левой части окна, вместо строки `System.out.println("Hello world!");`. +6. Опирайтесь на принятый [стиль оформления кода](https://github.com/netology-code/codestyle/blob/master/java/README.md). +7. Посмотреть результат выполнения файла можно, нажав на кнопку **Run**. Результат появится в правой части окна. +8. После окончания работы скопируйте ссылку на ваш repl в адресной строке браузера. +9. В личном кабинете на сайте [netology.ru](http://netology.ru/) в поле комментария к домашней работе вставьте скопированную ссылку и отправьте работу на проверку. + +*Никаких файлов прикреплять не нужно.* + +Все задачи обязательны к выполнению для получения зачета. Присылать на проверку можно каждую задачу по отдельности или все задачи вместе. Во время проверки по частям ваша домашняя работа будет со статусом "На доработке". + +Любые вопросы по решению задач задавайте в чате учебной группы. diff --git a/queue/README.md b/queue/README.md new file mode 100644 index 0000000..0250d16 --- /dev/null +++ b/queue/README.md @@ -0,0 +1,29 @@ +# Домашнее задание к занятию 4.2. Коллекции Queue + +Необходимо выполнить и предоставить на проверку следующую задачу: + +[1. Лифт](4.2.1); + +======= + +Задачи со звездочкой `*` необязательны для получения зачета. +Если вы хотите прислать дополнительное задание позже, напишите об этом при сдаче домашнего задания в личном кабинете на сайте [netology.ru](https://netology.ru). + +Любые вопросы по решению задач задавайте в чате учебной группы. + +## Инструкция по выполнению домашнего задания + +1. Пишите код в IDE (рекомендуем [Intellij Idea](https://www.jetbrains.com/idea/download/), версия Community). + 1. Почему лучше работать в IDE? — Ускоряет работу, есть подсветка ошибок, отладка по шагам. + 3. Почему Intellij Idea? — Родитель Android Studio, бесплатная, умная. +3. Опирайтесь на принятый [стиль оформления кода](https://github.com/netology-code/codestyle/blob/master/java/README.md). +4. Готовый код сдаем в Repl.it. +Для этого зарегистрируйтесь на сайте [Repl.IT](http://repl.it/). +6. Перейдите в раздел **my repls**. +7. Нажмите кнопку **Start coding now!**, если приступаете впервые, или **New Repl**, если у вас уже есть работы. +8. В списке языков выберите `Java`. +9. Убедитесь что на сайте всё работает также как и у вас на компьютере, нажав на кнопку **Run**. Результат появится в правой части окна. +10. После окончания работы скопируйте ссылку на ваш repl в адресной строке браузера. +11. В личном кабинете на сайте [netology.ru](http://netology.ru/) в поле комментария к домашней работе вставьте скопированную ссылку и отправьте работу на проверку. + +*Никаких файлов прикреплять не нужно.* diff --git a/tree-collections/4.5.1/README.md b/tree-collections/4.5.1/README.md new file mode 100644 index 0000000..721df2d --- /dev/null +++ b/tree-collections/4.5.1/README.md @@ -0,0 +1,33 @@ +## Задача 1. Пропущенные вызовы + +### Описание +Совсем недавно мы с вами создавали программу для хранения номеров телефонов. Следующая программа будет +будет немного схожа по тематике. Нужно написать программу для хранения пропущенных звонков, используя +уже изученные коллекции, в том числе коллекцию `TreeMap`. Программа должна хранить список пропущенных вызовов в формате: +`дата и время` звонка и `номер`. + +Вам надо разработать систему классов: +* Класс контакта +* Класс телефонной книги из прошлого задания + метод для поиска контакта по номеру +* Класс списка пропущенных вызовов + +Пропущенный вызов должен описываться временем и номером (не контактом). Для времени используйте класс `LocalDateTime`, для получения текущего момента времени - `LocalDateTime.now()`. + +В классе списка пропущенных вызовов должен быть метод, принимающий телефонную книгу и выводящий на экран все пропущенные вызовы в том порядке, в котором они поступали, при этом для номеров для которых есть контакт должно быть выведено на экран имя звонившего, а не номер. + +В классе `Main` продемонстрируйте работу ваших классов. + +### Реализация + +1. Возьмите классы с прошлого задания про справочник. Доработайте их для новых требований + +2. Для хранения пропущенных вызовов использовать `TreeMap`, где ключ — `время пропущенного вызова`, +а значение — `номер телефона`. Для хранения времени звонка подойдет тип данных `LocalDateTime` — у него уже +определен метод `compareTo` для использования в коллекции `TreeMap`. Нужно также создать отдельный класс для +хранения и работы с этой коллекцией `MissedCalls.java`. + +``` +Map missedCalls = new TreeMap<>(); +``` + +3. Создайте класс `Main` и продемонстрируйте в нём работу ваших классов diff --git a/tree-collections/4.5.2/README.md b/tree-collections/4.5.2/README.md new file mode 100644 index 0000000..7d4a3eb --- /dev/null +++ b/tree-collections/4.5.2/README.md @@ -0,0 +1,32 @@ +## Задача 2. Система подбора кандидатов + +### Описание +Задача по системе подбора кандидатов по базам резюме. +Необходимо хранить кандидатов таким образом, чтобы они сортировались в порядке убывания, по двум полям одновременно — по релевантности резюме и по оценке на собеседовании (т.е. среди двух кандидатов предпочтение отдаётся тому, у которого выше релевантность резюме, а среди равных по этому параметру тому, у кого выше оценка на собеседовании). + +### Функционал программы +1. Класс, описывающий кандидата +2. Создать множество, заполнить его кандидатами (общаться с пользователями не нужно); +2. Вывод кандидатов в отсортированном порядке. + +### Реализация +1. Вам нужно создать класс `Candidate`: + * "Фамилия Имя Отчество" (через пробел) — String — уникальное значение; + * Пол — String; + * Возраст — String; + * Релевантность резюме (соответствие резюме предлагаемой вакансии — relevance) — Integer (0-5, где 0 — низкое значение соответствия, а 5 — очень высокое значение соответствия); + * Оценка на собеседовании (rating) — Integer (0-5, где 0 — низкое значение оценки, а 5 — очень высокое значение оценки). +Также для вывода кандидата на экран переопределить метод `toString`. + +2. Необходимо хранить данные в `TreeSet` таким образом, чтобы они сортировались в порядке убывания, по двум атрибутам одновременно "relevance" и "rating". +Поэтому вы можете воспользоваться либо `Comparator`, с переопределенным методом `compare`, в котором будут проводиться сравнения по двум полям `relevance` и `rating`. + +Пример ожидаемой сортировки: + ``` + ФИО, Релевантность резюме, Оценка на собеседовании + Иванов Иван Иванович, 4, 5 + Петров Иван Александрович, 4, 3 + Максимов Иван Александрович, 3, 5 + ``` + +3. Для демонстрации работы программы создадим в коде при запуске программы несколько "кандидатов" (> 10), желательно несколько из них с одинаковым значением `relevance` для лучшего понимания. diff --git a/tree-collections/README.md b/tree-collections/README.md new file mode 100644 index 0000000..c955679 --- /dev/null +++ b/tree-collections/README.md @@ -0,0 +1,32 @@ +# Домашнее задание к занятию 4.5. Коллекции TreeMap и TreeSet + +Необходимо выполнить и предоставить на проверку следующие задачи: + +1. [Пропущенные вызовы](4.5.1); + +Дополнительная задача со * : + +2. [Система подбора кандидатов](4.5.2); + +======= + +Задачи со звездочкой `*` необязательны для получения зачета. +Если вы хотите прислать дополнительное задание позже, напишите об этом при сдаче домашнего задания в личном кабинете на сайте [netology.ru](https://netology.ru). + +Любые вопросы по решению задач задавайте в чате учебной группы (ссылку вы найдете в письме на вашей эл. почте). + +## Инструкция по выполнению домашнего задания + +1. Код пишите в IDE (рекомендуется Intellij Idea), а на сайт только вставте для отправки! + 1. Почему IDE? Быстрота, подсветка ошибок, отладка по шагам. + 2. Почему Intellij Idea? Родитель Android Studio, бесплатная, умная, лучшая IDE во всей мультивселенной. +3. Опирайтесь на принятый [стиль оформления кода](https://github.com/netology-code/codestyle/blob/master/java/README.md). +4. Зарегистрируйтесь на сайте [Repl.IT](http://repl.it/). +5. Перейдите в раздел **my repls**. +6. Нажмите кнопку **Start coding now!**, если приступаете впервые, или **New Repl**, если у вас уже есть работы. +7. В списке языков выберите `Java`. +8. Убедитесь что на сайте всё работает также как и у вас на компьютере, нажав на кнопку **Run**. Результат появится в правой части окна. +9. После окончания работы скопируйте ссылку на ваш repl в адресной строке браузера. +10. В личном кабинете на сайте [netology.ru](http://netology.ru/) в поле комментария к домашней работе вставьте скопированную ссылку и отправьте работу на проверку. + +*Никаких файлов прикреплять не нужно.*