();
+ collection.add(100);
+ collection.add(200);
+ collection.add(300);
+ collection.add(400);
+ collection.add(500);
+ collection.add(600);
+ list.collectionToTail(collection);
+ list.printForvard();
+
+ //добавляем коллекцию в начало списка
+ System.out.println("добавляем коллекцию в начало списка ...");
+ list.collectionToHead(collection);
+ list.printForvard();
+
+ //печатаем список в обратном порядке
+ System.out.println("печатаем список в обратном порядке ...");
+ list.printBackvard();
+
+
+
+
+ }
+}
diff --git a/java/lessons/src/main/java/ru/molokoin/j110/lab03/task3/ExpandedList/ExpandedList.java b/java/lessons/src/main/java/ru/molokoin/j110/lab03/task3/ExpandedList/ExpandedList.java
new file mode 100644
index 0000000..e73e474
--- /dev/null
+++ b/java/lessons/src/main/java/ru/molokoin/j110/lab03/task3/ExpandedList/ExpandedList.java
@@ -0,0 +1,14 @@
+package ru.molokoin.j110.lab03.task3.ExpandedList;
+
+public class ExpandedList {
+ private Node head = null;
+ private Node tail = null;
+ private class Node{
+ Integer[] data = new Integer[10];
+ Node next;
+ }
+ public static void main(String[] args) {
+ System.out.println("run thread: " + Thread.currentThread().getName());
+ }
+
+}
diff --git a/java/lessons/src/main/java/ru/molokoin/j110/lab04/j110-lab4.pdf b/java/lessons/src/main/java/ru/molokoin/j110/lab04/j110-lab4.pdf
new file mode 100644
index 0000000..f933d15
Binary files /dev/null and b/java/lessons/src/main/java/ru/molokoin/j110/lab04/j110-lab4.pdf differ
diff --git a/java/lessons/src/main/java/ru/molokoin/j110/lab04/logic/BooleanCollection.java b/java/lessons/src/main/java/ru/molokoin/j110/lab04/logic/BooleanCollection.java
new file mode 100644
index 0000000..0c59d18
--- /dev/null
+++ b/java/lessons/src/main/java/ru/molokoin/j110/lab04/logic/BooleanCollection.java
@@ -0,0 +1,122 @@
+package ru.molokoin.j110.lab04.logic;
+
+public class BooleanCollection implements CollectionFace{
+ public Boolean[] collection = new Boolean[size];
+ BooleanCollection(){
+ for(int i = 0; i < size; i++){
+ collection[i] = false;
+ }
+
+ }
+ /**
+ * возвращает значение хранящееся в поле булевого массива с порядковым номером index
+ */
+ @Override
+ public boolean isContain(int index) {
+ Boolean result = collection[index];
+ return result;
+ }
+
+ @Override
+ public void setTrueByIndex(int index)throws ArrayIndexOutOfBoundsException{
+ if (index > 1023 ){
+ throw new ArrayIndexOutOfBoundsException("Превышены границы массива, значение должно быть меньше 1024 ..." + "\n" + "метод setTrueByIndex(int index)" + " к полю с индексом " + index + " не применен ...");
+ }else{
+ if (index < 0){
+ throw new ArrayIndexOutOfBoundsException("Превышены границы массива, значение должно быть, больше или равно 0 ...");
+ }
+ }
+ collection[index] = true;
+ }
+
+ @Override
+ public void setFalseByIndex(int index) throws ArrayIndexOutOfBoundsException{
+ if (index > 1023 ){
+ throw new ArrayIndexOutOfBoundsException("Превышены границы массива, значение должно быть меньше 1024 ..." + "\n" + "метод setFalseByIndex(int index)" + " к полю с индексом " + index + " не применен ...");
+ }else{
+ if (index < 0){
+ throw new ArrayIndexOutOfBoundsException("Превышены границы массива, значение должно быть, больше или равно 0 ...");
+ }
+ }
+ collection[index] = false;
+
+ }
+
+ /**
+ * value 0 => false
+ * value 1 => true
+ * в остальных вариантах вылетает исключение.
+ * так же ошибка будет, если index не попадает в границы массива
+ */
+ @Override
+ public void setValueByIndex(int index, int value) throws IllegalArgumentException{
+ switch (value) {
+ case 0:
+ try {
+ setFalseByIndex(index);
+ } catch (ArrayIndexOutOfBoundsException e) {
+ System.out.println(e.getMessage());
+ }
+ break;
+ case 1:
+ try {
+ setTrueByIndex(index);
+ } catch (ArrayIndexOutOfBoundsException e) {
+ System.out.println(e.getMessage());
+ }
+ break;
+ default:
+ String msg = "";
+ msg = msg + "Значение должно быть либо 0 (false), либо 1 (true)\n";
+ msg = msg + "Метод setValueByIndex(int index, int value) ";
+ msg = msg + "для поля (index) " + index + ", для значения (value): " + value + " - не выполнен ...";
+ throw new IllegalArgumentException(msg);
+ }
+ }
+
+ @Override
+ public void invertByIndex(int index) throws ArrayIndexOutOfBoundsException {
+ Boolean bool = (index < 0) || (index >= size);
+ if (bool){
+ String msg = "";
+ msg = msg + "Превышены границы массива, значение (index) должно быть:\n" +
+ "- меньше 1024 ..." + "\n" +
+ "- больше нуля ..." + "\n" +
+ "метод invertByIndex(int index)" + " к полю с индексом " + index + " не применен ...";
+ throw new ArrayIndexOutOfBoundsException(msg);
+ }else{
+ /**
+ * проверять collection[index] на null не нужно,
+ * все значения инициированы в конструкторе класса
+ */
+ if (collection[index] == true){
+ collection[index] = false;
+ }else{
+ collection[index] = true;
+ }
+ }
+
+ }
+
+ @Override
+ public int countOfTrue() {
+ int i = 0;
+ for(Boolean b : collection){
+ if(b == true){
+ i++;
+ }
+ }
+ return i;
+ }
+
+ @Override
+ public String toString() {
+ String result = new String();
+ // перебираем все поля булевого массива (0 : 1023) и выводим значения хранящиеся в этих полях
+ for (int i = 0; i < size; i ++){
+ result = result + isContain(i) + " : ";
+ }
+ return result;
+ }
+
+}
diff --git a/java/lessons/src/main/java/ru/molokoin/j110/lab04/logic/CollectionFace.java b/java/lessons/src/main/java/ru/molokoin/j110/lab04/logic/CollectionFace.java
new file mode 100644
index 0000000..50a429e
--- /dev/null
+++ b/java/lessons/src/main/java/ru/molokoin/j110/lab04/logic/CollectionFace.java
@@ -0,0 +1,53 @@
+package ru.molokoin.j110.lab04.logic;
+
+/**
+ * Интерфейс булевого массива
+ */
+public interface CollectionFace {
+ public static int size = 1024;
+
+ /**
+ * проверка элемента с заданным индексом
+ * @param index
+ * @return
+ */
+ public abstract boolean isContain(int index);
+
+ /**
+ * установка (в true) элемента с заданным индексом
+ * @param index
+ */
+ public abstract void setTrueByIndex(int index);
+
+ /**
+ * сброс (в false) элемента с заданным индексом
+ * @param index
+ */
+ public abstract void setFalseByIndex(int index);
+
+ /**
+ * установка элемента с заданным индексом заданным логическим значением
+ * @param index
+ */
+ public abstract void setValueByIndex(int index, int value);
+
+ /**
+ * инвертирование элемента с заданным индексом
+ * @param index
+ */
+ public abstract void invertByIndex(int index);
+
+ /**
+ * метод, возвращающий количество элементов, установленных в true
+ * @return
+ */
+ public abstract int countOfTrue();
+
+ /**
+ * метод toString(), возвращающий последовательность нулей и единиц, где каждый сим-
+вол представляет значение соответствующего элемента массива
+ */
+ public abstract String toString();
+
+
+}
diff --git a/java/lessons/src/main/java/ru/molokoin/j110/lab04/logic/IntCollection.java b/java/lessons/src/main/java/ru/molokoin/j110/lab04/logic/IntCollection.java
new file mode 100644
index 0000000..d725bbb
--- /dev/null
+++ b/java/lessons/src/main/java/ru/molokoin/j110/lab04/logic/IntCollection.java
@@ -0,0 +1,210 @@
+package ru.molokoin.j110.lab04.logic;
+
+/**
+ * Реализация интерфейса булевого массива
+ * Логические значения хранятся в битах массива целочисленных значений int
+ */
+public class IntCollection implements CollectionFace{
+ int size = 1024;//размер булевого массива
+ int box = 32;//количество бит выделенное под значение типа integer
+ int[] collection = new int[size/box];//1024 (размер булевого массива)/32 (размер блока, для формирования интового значения)
+
+ /**
+ * index - варьирует от 0 до 1024 (весь булевский массив)
+ * возвращает true, если в поле index содержится 1, или true
+ * возвращает false, если в поле index содержится 0
+ * TODO проверка границ index (0 --> 1023)
+ */
+ @Override
+ public boolean isContain(int index) throws ArrayIndexOutOfBoundsException{
+ /**
+ * indexOfBox - порядковый номер бокса в булевом массиве
+ * или индекс значения в интовом массиве
+ */
+ int indexOfBox = index/box;//результат целочисленного деления
+ //порядковый номер бита в боксе
+ int indexInBox = index%box;//остаток от деления
+ /**
+ * value - число, хранимое в интовом массиве, в битах которого зашифровано необходимое булевое значение
+ * при переводе значения этого числа в двоичный код, будет получен массив битов,
+ * где значение под номером indexInBox - будет искомое значение
+ */
+ int value = collection[indexOfBox];
+ /**
+ * Далее можно выводить в печать интовое значение, побитовое значение интового числа или обрабатывать биты, хранимые в этом числе ...
+ */
+ /**
+ * двигаем единичку в позицию, где находится искомый бит в боксе
+ */
+ int mask = 1 << indexInBox;
+ /**
+ * сравниваем интовое значение, преобразованное в двоичный код с маской
+ * преобразование на сколько понимаю происходит автоматически.
+ * 0 0 1 0 0 0 0 0 mask
+ * 1 0 1 0 1 0 1 0 value
+ * после операции "И" получаем
+ * 0 0 1 0 0 0 0 0
+ * далее идет сравнение с mask
+ */
+ Boolean result = ((value&mask) == mask);
+ return result;
+ }
+
+ /**
+ * 0 0 1 0 0 0 0 0 mask
+ * 1 0 1 0 1 0 1 0 value
+ * после операции "&" : "И" получаем
+ * 0 0 1 0 0 0 0 0
+ * после "|" : "ИЛИ" получаем
+ * 1 0 1 0 1 0 1 0
+ * после "^" : "xor" получаем
+ * 1 0 0 0 1 0 1 0
+ */
+ @Override
+ public void setTrueByIndex(int index) throws ArrayIndexOutOfBoundsException{
+ //обработка исключений
+ Boolean b = (index < 0)&(index > 1023);
+ if(b){
+ String msg = "";
+ msg = msg + "Превышены границы массива, значение (index) должно быть:\n" +
+ "- меньше 1024 ..." + "\n" +
+ "- больше нуля ..." + "\n" +
+ "метод setTrueByIndex(int index)" + " к полю с индексом " + index + " не применен ...";
+ throw new ArrayIndexOutOfBoundsException(msg);
+ }
+ //обработка значений массива
+ try {
+ if (isContain(index)){
+ return;
+ }else{
+ int indexOfBox = index/box;
+ int indexInBox = index%box;
+ int value = collection[indexOfBox];
+ int mask = 1 << indexInBox;
+ /**
+ * не меняем значения value,
+ * кроме замаскированного поля и только в случае, если там 0
+ */
+ value = value | mask;
+ collection[indexOfBox] = value;
+ }
+ } catch (ArrayIndexOutOfBoundsException e) {
+ System.out.println(e.getMessage());
+ }
+ }
+
+ @Override
+ public void setFalseByIndex(int index) throws ArrayIndexOutOfBoundsException{
+ //обработка исключений
+ Boolean b = (index < 0)&(index > 1023);
+ if(b){
+ String msg = "";
+ msg = msg + "Превышены границы массива, значение (index) должно быть:\n" +
+ "- меньше 1024 ..." + "\n" +
+ "- больше нуля ..." + "\n" +
+ "метод setFalseByIndex(int index)" + " к полю с индексом " + index + " не применен ...";
+ throw new ArrayIndexOutOfBoundsException(msg);
+ }
+ if (isContain(index) == false){
+ return;
+ }
+ /**
+ * в поле точно единица, которую надо заменить на 0, не меняя остальных значений в боксе.
+ * - все значения сравниваются с нулями и должны в результате не измениться
+ * - сравнивая единицу с единицей нужно получить ноль
+ * или - не заменит единицу, сохранив остальные значения
+ * и - не заменит единицу, затрет остальные единицы
+ * искл-или - заменит единицу, не изменив остальные значения (то, что надо)
+ */
+ else{
+ int indexOfBox = index/box;
+ int indexInBox = index%box;
+ int value = collection[indexOfBox];
+ int mask = 1 << indexInBox;
+ value = value ^ mask;
+ collection[indexOfBox] = value;
+ }
+ }
+
+ @Override
+ public void setValueByIndex(int index, int value) throws IllegalArgumentException, ArrayIndexOutOfBoundsException{
+ //обработка исключений
+ Boolean b = (index < 0)|(index > 1023);
+ if(b){
+ String msg = "";
+ msg = msg + "Превышены границы массива, значение (index) должно быть:\n" +
+ "- меньше 1024 ..." + "\n" +
+ "- больше нуля ..." + "\n" +
+ "метод setValueByIndex(int index, int value)" + " к полю с индексом " + index + " не применен ...";
+ throw new ArrayIndexOutOfBoundsException(msg);
+ }
+ //логика метода
+ switch (value) {
+ case 0:
+ try {
+ setFalseByIndex(index);
+ } catch (ArrayIndexOutOfBoundsException e) {
+ System.out.println(e.getMessage());
+ }
+ break;
+ case 1:
+ try {
+ setTrueByIndex(index);
+ } catch (ArrayIndexOutOfBoundsException e) {
+ System.out.println(e.getMessage());
+ }
+ break;
+ default:
+ String msg = "";
+ msg = msg + "Значение должно быть либо 0 (false), либо 1 (true)\n";
+ msg = msg + "Метод setValueByIndex(int index, int value) ";
+ msg = msg + "для поля (index) " + index + ", для значения (value): " + value + " - не выполнен ...";
+ throw new IllegalArgumentException(msg);
+ }
+
+ }
+
+ @Override
+ public void invertByIndex(int index) throws IndexOutOfBoundsException{
+ //обработка исключений
+ Boolean b = (index < 0) | (index > size);
+ if (b){
+ String msg = "";
+ msg = msg + "Превышены границы массива, значение (index) должно быть:\n" +
+ "- меньше 1024 ..." + "\n" +
+ "- больше нуля ..." + "\n" +
+ "метод invertByIndex(int index)" + " к полю с индексом " + index + " не применен ...";
+ throw new IndexOutOfBoundsException(msg);
+ }
+ //логика метода
+ try {
+ if (isContain(index)){
+ setFalseByIndex(index);
+ }else {
+ setTrueByIndex(index);
+ }
+ } catch (ArrayIndexOutOfBoundsException e) {
+ System.out.println(e.getMessage());
+ }
+ }
+
+ @Override
+ public int countOfTrue() {
+ int count = 0;
+ for(int i = 0; i < size; i++){
+ if (isContain(i)){
+ count++;
+ }
+ }
+ return count;
+ }
+ @Override
+ public String toString() {
+ String result = new String();
+ // перебираем все поля булевого массива (0 : 1024) и выводим значения хранящиеся в этих полях
+ for (int i = 0; i < size; i ++){
+ result = result + isContain(i) + " : ";
+ }
+ return result;
+ }
+}
diff --git a/java/lessons/src/main/java/ru/molokoin/j110/lab04/logic/Runner.java b/java/lessons/src/main/java/ru/molokoin/j110/lab04/logic/Runner.java
new file mode 100644
index 0000000..8813fd3
--- /dev/null
+++ b/java/lessons/src/main/java/ru/molokoin/j110/lab04/logic/Runner.java
@@ -0,0 +1,189 @@
+package ru.molokoin.j110.lab04.logic;
+
+public class Runner {
+ public static void main(String[] args) {
+ System.out.println("Запущен основной поток: " + Thread.currentThread().getName() + " ...");
+ System.out.println("=====Работа с булевым массивом=====");
+ System.out.println("Создаем новую коллекцию ...");
+ BooleanCollection bc = new BooleanCollection();
+
+ //проверка метода setTrueByIndex(int index)
+ {
+ System.out.println("Проверка метода setTrueByIndex(int index) ...");
+ int index = 3;
+ System.out.println("index = " + index);
+ try {
+ bc.setTrueByIndex(index);
+ } catch (ArrayIndexOutOfBoundsException e) {
+ System.out.println(e.getMessage());
+ }
+ System.out.println();
+ //проверка метода setTrueByIndex(int index) с предельными значениями
+ System.out.println("Проверка метода setTrueByIndex(int index) с предельными значениями (выше верхней границы) ...");
+ index = -5;
+ System.out.println("index = " + index);
+ try {
+ bc.setTrueByIndex(index);
+ } catch (ArrayIndexOutOfBoundsException e) {
+ System.out.println(e.getMessage());
+ }
+ System.out.println();
+ System.out.println("проверка метода setTrueByIndex(int index) с предельными значениями (меньше нижней границы) ...");
+ index = 1024;
+ System.out.println("index = " + index);
+ try {
+ bc.setTrueByIndex(index);
+ } catch (ArrayIndexOutOfBoundsException e) {
+ System.out.println(e.getMessage());
+ }
+ System.out.println("--------------------------------------------");
+ }
+
+ //проверка setValueByIndex(int index, int value)
+ {
+ System.out.println("проверка setValueByIndex(int index, int value) ...");
+ int index = 1;
+ int value = 1;
+ try {
+ bc.setValueByIndex(index, value);
+ } catch (IllegalArgumentException e) {
+ System.out.println(e.getMessage());
+ }
+ System.out.println("проверка setValueByIndex(int index, int value) с предельными значениями ...");
+ index = 1024;
+ value = 1;
+ try {
+ bc.setValueByIndex(index, value);
+ } catch (IllegalArgumentException e) {
+ System.out.println(e.getMessage());
+ }
+ System.out.println("проверка setValueByIndex(int index, int value) с предельными значениями ...");
+ index = 0;
+ value = 10;
+ try {
+ bc.setValueByIndex(index, value);
+ } catch (IllegalArgumentException e) {
+ System.out.println(e.getMessage());
+ }
+ System.out.println("--------------------------------------------");
+ }
+
+ //проверка invertByIndex(int index)
+ {
+ System.out.println("проверка invertByIndex(int index) ...");
+ try {
+ int i = 5;
+ bc.invertByIndex(i);
+ } catch (ArrayIndexOutOfBoundsException e) {
+ System.out.println(e.getMessage());
+ }
+ System.out.println("проверка invertByIndex(int index) с предельными значениями аргументов ...");
+ try {
+ int i = 1024;
+ bc.invertByIndex(i);
+ } catch (ArrayIndexOutOfBoundsException e) {
+ System.out.println(e.getMessage());
+ }
+ System.out.println("--------------------------------------------");
+ }
+
+ //проверка метода countOfTrue()
+ {
+ String msg = "Количество полей в массиве, со значением true: " + bc.countOfTrue();
+ System.out.println(msg);
+ System.out.println("--------------------------------------------");
+ }
+
+ //вывод коллекции в консоль
+ {
+ System.out.println("Выводим коллекцию в консоль ...");
+ System.out.println();
+ System.out.println(bc.toString());
+ System.out.println();
+ }
+
+ System.out.println("=====Работа с целочисленным массивом=====");
+ System.out.println("Создаем новую коллекцию ...");
+ IntCollection ic = new IntCollection();
+
+ //проверка метода isContain(int index)
+ {
+ //вывод коллекции в консоль по сути является проверкой метода
+ }
+
+ //проверка метода setTrueByIndex(int index)
+ {
+ System.out.println("Проверка метода setTrueByIndex(int index) ...");
+ int i = 1;
+ ic.setTrueByIndex(i);
+ ic.setTrueByIndex(0);
+ ic.setTrueByIndex(2);
+ System.out.println("--------------------------------------------");
+
+ }
+
+ //проверка метода setFalseByIndex(int index)
+ {
+ System.out.println("Проверка метода setFalseByIndex(int index) ...");
+ int i = 1;
+ ic.setFalseByIndex(i);
+ System.out.println("--------------------------------------------");
+ }
+
+ //проверка метода setValueByIndex(int index, int value)
+ {
+ System.out.println("Проверка метода setValueByIndex(int index, int value) ...");
+ int index = 3;
+ int value = 1;
+ try {
+ ic.setValueByIndex(index, value);
+ } catch (IllegalArgumentException e) {
+ System.out.println(e.getMessage());
+ }
+ //проверка с предельными значениями
+ System.out.println("Проверка метода setValueByIndex(int index, int value) с предельными значениями ...");
+ System.out.println("превышение по value ...");
+ try {
+ ic.setValueByIndex(index, 5);
+ } catch (IllegalArgumentException e) {
+ System.out.println(e.getMessage());
+ }
+ System.out.println("превышение по index ...");
+ try {
+ ic.setValueByIndex(5000, value);
+ } catch ( ArrayIndexOutOfBoundsException e) {
+ System.out.println(e.getMessage());
+ }
+ System.out.println("--------------------------------------------");
+ }
+
+ //проверка метода invertByIndex(int index)
+ {
+ System.out.println("Проверка метода invertByIndex(int index) ...");
+ int i = 5;
+ try {
+ ic.invertByIndex(i);
+ } catch (ArrayIndexOutOfBoundsException e) {
+ System.out.println(e.getMessage());
+ }
+ System.out.println("Проверка метода invertByIndex(int index). Проверка предельных значений...");
+ i = 2000;
+ try {
+ ic.invertByIndex(i);
+ } catch (IndexOutOfBoundsException e) {
+ System.out.println(e.getMessage());
+ }
+ System.out.println("--------------------------------------------");
+ }
+
+ //проверка метода countOfTrue()
+ System.out.println("Количество полей со значением true: " + ic.countOfTrue());
+
+ //выводим коллекцию в консоль
+ {
+ System.out.println("Выводим коллекцию в консоль ...");
+ System.out.println();
+ System.out.println(ic.toString());
+ }
+ }
+}
diff --git a/java/lessons/src/main/java/ru/molokoin/j110/lab04/logic/docs/j110-lab4.pdf b/java/lessons/src/main/java/ru/molokoin/j110/lab04/logic/docs/j110-lab4.pdf
new file mode 100644
index 0000000..f933d15
Binary files /dev/null and b/java/lessons/src/main/java/ru/molokoin/j110/lab04/logic/docs/j110-lab4.pdf differ
diff --git a/java/lessons/src/main/java/ru/molokoin/j110/lab05/j110-lab5.pdf b/java/lessons/src/main/java/ru/molokoin/j110/lab05/j110-lab5.pdf
new file mode 100644
index 0000000..d10bb6e
Binary files /dev/null and b/java/lessons/src/main/java/ru/molokoin/j110/lab05/j110-lab5.pdf differ
diff --git a/java/lessons/src/main/java/ru/molokoin/j110/lectures/A.java b/java/lessons/src/main/java/ru/molokoin/j110/lectures/A.java
new file mode 100644
index 0000000..5dd3cd4
--- /dev/null
+++ b/java/lessons/src/main/java/ru/molokoin/j110/lectures/A.java
@@ -0,0 +1,39 @@
+/*
+ * To change this license header, choose License Headers in Project Properties.
+ * To change this template file, choose Tools | Templates
+ * and open the template in the editor.
+ */
+
+package ru.molokoin.j110.lectures;
+
+/**
+ *
+ * @author (C)Y.D.Zakovryashin, 07.10.2022
+ */
+public class A {
+ private A a;
+ private A b;
+
+ public A () {
+ this(null);
+ System.out.println ("A::A()");
+ }
+
+ public A (A a) {
+ System.out.println("A::A(A)");
+ }
+
+ public void a () {
+ System.out.println("A::a()");
+ }
+
+ public void a (A a) {
+ System.out.println("A::a(A)");
+ }
+
+ public static void main (String[] args) {
+ System.out.println("Hello, Java!!!");
+ A a = new A (null);
+ a.a(a);
+ }
+}
diff --git a/java/lessons/src/main/java/ru/molokoin/j110/lectures/B.java b/java/lessons/src/main/java/ru/molokoin/j110/lectures/B.java
new file mode 100644
index 0000000..fb0036f
--- /dev/null
+++ b/java/lessons/src/main/java/ru/molokoin/j110/lectures/B.java
@@ -0,0 +1,29 @@
+/*
+ * To change this license header, choose License Headers in Project Properties.
+ * To change this template file, choose Tools | Templates
+ * and open the template in the editor.
+ */
+package ru.molokoin.j110.lectures;
+
+/**
+ *
+ * @author (C)Y.D.Zakovryashin, 07.10.2022
+ */
+public class B extends A {
+
+ public B() {
+ super(null); // this();
+ System.out.println("B::B()");
+ }
+
+ public static void main(String[] args) {
+ B b = new B();
+ b.a();
+ }
+
+ @Override
+ public void a() {
+ System.out.println("B::a()");
+ super.a();
+ }
+}
diff --git a/java/lessons/src/main/java/ru/molokoin/j110/lectures/C.java b/java/lessons/src/main/java/ru/molokoin/j110/lectures/C.java
new file mode 100644
index 0000000..8d59f58
--- /dev/null
+++ b/java/lessons/src/main/java/ru/molokoin/j110/lectures/C.java
@@ -0,0 +1,28 @@
+/*
+ * To change this license header, choose License Headers in Project Properties.
+ * To change this template file, choose Tools | Templates
+ * and open the template in the editor.
+ */
+package ru.molokoin.j110.lectures;
+
+/**
+ *
+ * @author (C)Y.D.Zakovryashin, 07.10.2022
+ */
+public class C implements I {
+
+ public void a() {
+ System.out.println("C::a()");
+ }
+
+ public void a(A a) {
+ System.out.println("C::a(A)");
+ }
+
+ public static void main(String[] args) {
+ C c = new C();
+ c.a();
+ c.a(null);
+ c.b();
+ }
+}
diff --git a/java/lessons/src/main/java/ru/molokoin/j110/lectures/I.java b/java/lessons/src/main/java/ru/molokoin/j110/lectures/I.java
new file mode 100644
index 0000000..5add864
--- /dev/null
+++ b/java/lessons/src/main/java/ru/molokoin/j110/lectures/I.java
@@ -0,0 +1,24 @@
+/*
+ * To change this license header, choose License Headers in Project Properties.
+ * To change this template file, choose Tools | Templates
+ * and open the template in the editor.
+ */
+package ru.molokoin.j110.lectures;
+
+/**
+ *
+ * @author (C)Y.D.Zakovryashin, 07.10.2022
+ */
+public interface I {
+
+ public static final A a = new A(null);
+ A b = null;
+
+ public abstract void a();
+
+ void a(A a);
+
+ default void b() {
+ System.out.println("I:b() - default");
+ }
+}
diff --git a/java/lessons/src/main/java/ru/molokoin/j110/lectures/pages/DEV-J110.01. Основы ООП.pdf b/java/lessons/src/main/java/ru/molokoin/j110/lectures/pages/DEV-J110.01. Основы ООП.pdf
new file mode 100644
index 0000000..2b901cc
Binary files /dev/null and b/java/lessons/src/main/java/ru/molokoin/j110/lectures/pages/DEV-J110.01. Основы ООП.pdf differ
diff --git a/java/lessons/src/main/java/ru/molokoin/j110/lectures/pages/DEV-J110.02. Обзор платформы.pdf b/java/lessons/src/main/java/ru/molokoin/j110/lectures/pages/DEV-J110.02. Обзор платформы.pdf
new file mode 100644
index 0000000..90a617f
Binary files /dev/null and b/java/lessons/src/main/java/ru/molokoin/j110/lectures/pages/DEV-J110.02. Обзор платформы.pdf differ
diff --git a/java/lessons/src/main/java/ru/molokoin/j110/lectures/pages/DEV-J110.03. Классы.pdf b/java/lessons/src/main/java/ru/molokoin/j110/lectures/pages/DEV-J110.03. Классы.pdf
new file mode 100644
index 0000000..072f72e
Binary files /dev/null and b/java/lessons/src/main/java/ru/molokoin/j110/lectures/pages/DEV-J110.03. Классы.pdf differ
diff --git a/java/lessons/src/main/java/ru/molokoin/j110/lectures/pages/DEV-J110.04. Наследование классов.pdf b/java/lessons/src/main/java/ru/molokoin/j110/lectures/pages/DEV-J110.04. Наследование классов.pdf
new file mode 100644
index 0000000..565fefb
Binary files /dev/null and b/java/lessons/src/main/java/ru/molokoin/j110/lectures/pages/DEV-J110.04. Наследование классов.pdf differ
diff --git a/java/lessons/src/main/java/ru/molokoin/j110/lectures/pages/DEV-J110.05. Специальные виды классов.pdf b/java/lessons/src/main/java/ru/molokoin/j110/lectures/pages/DEV-J110.05. Специальные виды классов.pdf
new file mode 100644
index 0000000..92f73d3
Binary files /dev/null and b/java/lessons/src/main/java/ru/molokoin/j110/lectures/pages/DEV-J110.05. Специальные виды классов.pdf differ
diff --git a/java/lessons/src/main/java/ru/molokoin/j110/lectures/pages/DEV-J110.06. Интерфейсы.pdf b/java/lessons/src/main/java/ru/molokoin/j110/lectures/pages/DEV-J110.06. Интерфейсы.pdf
new file mode 100644
index 0000000..110e7c1
Binary files /dev/null and b/java/lessons/src/main/java/ru/molokoin/j110/lectures/pages/DEV-J110.06. Интерфейсы.pdf differ
diff --git a/java/lessons/src/main/java/ru/molokoin/j120/lab01/j120-lab1.pdf b/java/lessons/src/main/java/ru/molokoin/j120/lab01/j120-lab1.pdf
new file mode 100644
index 0000000..bc487ba
Binary files /dev/null and b/java/lessons/src/main/java/ru/molokoin/j120/lab01/j120-lab1.pdf differ
diff --git a/java/lessons/src/main/java/ru/molokoin/j120/lab01/task1/vers01/Code.java b/java/lessons/src/main/java/ru/molokoin/j120/lab01/task1/vers01/Code.java
new file mode 100644
index 0000000..6e42170
--- /dev/null
+++ b/java/lessons/src/main/java/ru/molokoin/j120/lab01/task1/vers01/Code.java
@@ -0,0 +1,61 @@
+package ru.molokoin.j120.lab01.task1.vers01;
+
+public class Code {
+ private int[]code;
+ public Code(int[]code){
+ setCode(code);
+ }
+ /**
+ * @param code the code to set
+ */
+ public void setCode(int[] code) {
+ this.code = code;
+ }
+ public static Code ofString(String codeString){
+ char[] c = codeString.toCharArray();
+ int[] code = new int[c.length-2];//исключили скобки
+ int codeIndex = 0;
+ for (char d : c) {
+ if ((d != "(".toCharArray()[0]) && (d != ")".toCharArray()[0])){
+ code[codeIndex] = Character.getNumericValue(d);
+ codeIndex++;
+ }
+ }
+ return new Code(code);
+ }
+ /**
+ * @return the code
+ */
+ public int[] getCode() {
+ return code;
+ }
+ @Override
+ public String toString() {
+ String result = "";
+ String code = "";
+ for (int i : this.code) {
+ code = code + i;
+ }
+ result = "(" + code + ")";
+ return result;
+ }
+ /**
+ * Проверка функционала класса
+ * @param args
+ */
+ public static void main(String[] args) {
+ {String nums = "0123456789";
+ char[] c = nums.toCharArray();
+ for (char d : c) {
+ System.out.println((int)d + " : " + Integer.toBinaryString(d));
+ }
+ System.out.println();}
+
+ {String art = "()";
+ char[] c = art.toCharArray();
+ for (char d : c) {
+ System.out.println((int)d + " : " + Integer.toBinaryString(d));
+ }
+ System.out.println();}
+ }
+}
diff --git a/java/lessons/src/main/java/ru/molokoin/j120/lab01/task1/vers01/Number.java b/java/lessons/src/main/java/ru/molokoin/j120/lab01/task1/vers01/Number.java
new file mode 100644
index 0000000..6afdad3
--- /dev/null
+++ b/java/lessons/src/main/java/ru/molokoin/j120/lab01/task1/vers01/Number.java
@@ -0,0 +1,38 @@
+package ru.molokoin.j120.lab01.task1.vers01;
+
+public class Number {
+ private int[] number;
+
+ public Number(int[] number){
+ setNumber(number);
+ }
+ public static Number ofString(String numberString){
+ char[] c = numberString.toCharArray();
+ int[] number = new int[c.length - 2];//убрали тире из номера (две штуки)
+ if(number.length == 6){
+ //
+ }else{
+ //
+ }
+
+
+
+ return null;
+ }
+
+ /**
+ * @param number the number to set
+ */
+ public void setNumber(int[] number) {
+ this.number = number;
+ }
+ /**
+ * @return the number
+ */
+ public int[] getNumber() {
+ return number;
+ }
+
+
+
+}
diff --git a/java/lessons/src/main/java/ru/molokoin/j120/lab01/task1/vers01/Phone.java b/java/lessons/src/main/java/ru/molokoin/j120/lab01/task1/vers01/Phone.java
new file mode 100644
index 0000000..026912d
--- /dev/null
+++ b/java/lessons/src/main/java/ru/molokoin/j120/lab01/task1/vers01/Phone.java
@@ -0,0 +1,117 @@
+package ru.molokoin.j120.lab01.task1.vers01;
+
+/**
+ * Класс для зранения телефонного номера.
+ *
+ */
+public class Phone {
+ private int[] number;//массив цифр номера телефона
+ private int[] code;//массив цифр кода региона
+ //преобразовать строку в массив int
+ public Phone(String phone){}
+ public Phone(int[] code, int[] number){
+ setCode(code);
+ setNumber(number);
+ }
+
+ /**
+ * @param code the digit to set
+ */
+ public void setCode(int[] code) {
+ this.code = code;
+ }
+ /**
+ * @return the digit
+ */
+ public int[] getCode() {
+ return code;
+ }
+ /**
+ * @param number the number to set
+ */
+ public void setNumber(int[] number) {
+ this.number = number;
+ }
+ /**
+ * @return the number
+ */
+ public int[] getNumber() {
+ return number;
+ }
+ @Override
+ public String toString() {
+ String code = "";
+ for (int i : this.code) {
+ code = code + i;
+ }
+ String number = "";
+ for (int i : this.number) {
+ number = number + i;
+ }
+ String result;
+ result = "(" + code + ")" + number;
+ return result;
+ }
+ /**
+ * Метод преобразует строку в объект Phone
+ * содержимое скобок пишет в digit
+ * содержимое после скобок пишет в number
+ * @param phone
+ * @return
+ */
+ public static Phone ofString(String phoneString){
+ int[] code;
+ int[] number;
+ char[] c = phoneString.toCharArray();
+ int i = 0;
+ //определяем индексы плей, указывающих начало и окончание кода города
+ int codeStart = 0;
+ int codeStop = 0;
+ while(i < c.length){
+ if((c[i]) == "(".toCharArray()[0]){
+ codeStart = i;
+ }
+ if((c[i]) == ")".toCharArray()[0]){
+ codeStop = i;
+ }
+ i++;
+ }
+ System.out.println("digitStart : " + codeStart);
+ System.out.println("digitStop : " + codeStop);
+ //инициализация int[] number; определяем длину массива
+ number = new int[c.length - codeStop - 1];
+ //инициализация int[] digit
+ code = new int[codeStop - 1];
+ i = 0;
+ int indexNumber = 0;
+ int indexCode = 0;
+ while (i < c.length){
+ if (i > codeStop){
+ number[indexNumber] = Character.getNumericValue(c[i]) ;
+ indexNumber++;
+ }
+ if((i < codeStop)&&(i > codeStart)){
+ code[indexCode] = Character.getNumericValue(c[i]);
+ indexCode++;
+ }
+ i++;
+ }
+ Phone result = new Phone(code, number);
+ return result;
+ }
+
+ /**
+ * тесты методов класса Phone
+ * @param args
+ */
+ public static void main(String[] args) {
+ int[] d = {8, 1, 2};
+ int[] n = {1, 2, 3, 4, 5, 6, 7};
+ Phone p = new Phone(d, n);
+ String phoneString = p.toString();
+ System.out.println("phone : " + phoneString);
+ System.out.println("phoneString.length() : " + phoneString.length());
+ Phone pos = Phone.ofString("(495)3678792");
+ System.out.println("pos : " + pos.toString());
+ }
+}
diff --git a/java/lessons/src/main/java/ru/molokoin/j120/lab01/task1/vers01/PhoneBook.java b/java/lessons/src/main/java/ru/molokoin/j120/lab01/task1/vers01/PhoneBook.java
new file mode 100644
index 0000000..9d90dc4
--- /dev/null
+++ b/java/lessons/src/main/java/ru/molokoin/j120/lab01/task1/vers01/PhoneBook.java
@@ -0,0 +1,8 @@
+package ru.molokoin.j120.lab01.task1.vers01;
+
+public class PhoneBook{
+ public static void main(String[] args) {
+
+ }
+
+}
diff --git a/java/lessons/src/main/java/ru/molokoin/j120/lab01/task1/vers02/Phone.java b/java/lessons/src/main/java/ru/molokoin/j120/lab01/task1/vers02/Phone.java
new file mode 100644
index 0000000..76112dd
--- /dev/null
+++ b/java/lessons/src/main/java/ru/molokoin/j120/lab01/task1/vers02/Phone.java
@@ -0,0 +1,10 @@
+package ru.molokoin.j120.lab01.task1.vers02;
+
+/**
+ * Класс хранения телефонного номера.
+ *
+ */
+public class Phone {
+ private int[] complete = new int[10];
+
+}
diff --git a/java/lessons/src/main/java/ru/molokoin/j120/lab01/task1/vers03/Code.java b/java/lessons/src/main/java/ru/molokoin/j120/lab01/task1/vers03/Code.java
new file mode 100644
index 0000000..6f29c26
--- /dev/null
+++ b/java/lessons/src/main/java/ru/molokoin/j120/lab01/task1/vers03/Code.java
@@ -0,0 +1,53 @@
+package ru.molokoin.j120.lab01.task1.vers03;
+
+import java.util.Arrays;
+
+/**
+ * Класс хранит данные о коде региона, составляющем первую секцию полного номера тлефона,
+ * и предоставляет методы, для обработки данных о коде региона.
+ * Класс реализует интерфейс IPart, прдусматривающий основные методы,
+ * для работы с секциями полного номера телефона
+ */
+public class Code implements IPart{
+ private int[] value;
+ /**
+ * Основной конструктор класса,
+ * создающий объекты класса на основании строкового представления кода региона
+ * @param string
+ */
+ public Code(String string){
+ setValue(IPart.ofString(string));
+ }
+
+ @Override
+ public int[] getValue() {
+ return value;
+ }
+
+ @Override
+ public void setValue(int[] value) {
+ this.value = value;
+ }
+
+ /**
+ * Метод преобразует поле int[] value в строку
+ */
+ @Override
+ public String toString(){
+ String s = "(";
+ String string = "";
+ string = Arrays.toString(value).replaceAll(Regex.NON_DIGIT.get(), "");
+ s = s + string + ")";
+ return s;
+ }
+
+ @Override
+ public void print() {
+ System.out.println(toString());
+ }
+ public static void main(String[] args) {
+ Code code = new Code("(812)");
+ code.print();
+ }
+
+}
diff --git a/java/lessons/src/main/java/ru/molokoin/j120/lab01/task1/vers03/IPart.java b/java/lessons/src/main/java/ru/molokoin/j120/lab01/task1/vers03/IPart.java
new file mode 100644
index 0000000..3cf97e3
--- /dev/null
+++ b/java/lessons/src/main/java/ru/molokoin/j120/lab01/task1/vers03/IPart.java
@@ -0,0 +1,30 @@
+package ru.molokoin.j120.lab01.task1.vers03;
+
+/**
+ * интерфейс IPart, прдусматривает основные методы,
+ * для работы с секциями полного номера телефона
+ */
+public interface IPart {
+ public abstract int[] getValue();
+ public abstract void setValue(int[] value);
+ public abstract String toString();
+ public abstract void print();
+ /**
+ * метод убирает все не числовые поля в строке,
+ * преобразует полученную строку в int[],
+ * который возвращает в качестве результата выполнения метода.
+ * @param string
+ * @return
+ */
+ public static int[] ofString(String string){
+ String s = string.replaceAll(Regex.NON_DIGIT.get(), "");
+ int[] result = new int[s.length()];
+ int i = 0;
+ char[] chars = s.toCharArray();
+ for (char c : chars) {
+ result[i] = Character.getNumericValue(c);
+ i++;
+ }
+ return result;
+ }
+}
diff --git a/java/lessons/src/main/java/ru/molokoin/j120/lab01/task1/vers03/Number.java b/java/lessons/src/main/java/ru/molokoin/j120/lab01/task1/vers03/Number.java
new file mode 100644
index 0000000..9abd77f
--- /dev/null
+++ b/java/lessons/src/main/java/ru/molokoin/j120/lab01/task1/vers03/Number.java
@@ -0,0 +1,69 @@
+package ru.molokoin.j120.lab01.task1.vers03;
+
+import java.util.Arrays;
+
+/**
+ * Класс, хранящий данные о секции number полного номера телефона,
+ * реализует интерфейс IPart, прдусматривающий основные методы,
+ * для работы с секциями полного номера телефона
+ */
+public class Number implements IPart{
+ /**
+ * Поле хранит набор цифр, составляющих секцию number полного номера телефона
+ */
+ private int[] value;
+
+ /**
+ * Основной конструктор класса, создает объекты
+ * на основании строкового представления секции number полного номера телефона
+ * @param stringValue
+ */
+ Number(String stringValue){
+ setValue(IPart.ofString(stringValue));
+ }
+
+ @Override
+ public int[] getValue() {
+ return this.value;
+ }
+
+ @Override
+ public void setValue(int[] value) {
+ this.value = value;
+ }
+
+ /**
+ * выводит в консоль строковое представление секции number
+ */
+ @Override
+ public void print() {
+ System.out.println(toString());
+ }
+
+ /**
+ * Преобразование int[] в строку
+ * с добавлением "-" перед последними двумя парами цифр
+ * Примеры:
+ * 000-00-00
+ * 00-00-00
+ */
+ @Override
+ public String toString(){
+ String string = Arrays.toString(value).replaceAll(Regex.NON_DIGIT.get(), "");//получили строку цифр, без дефисов
+ int length = string.length();
+ String first = string.substring(0, length-4);
+ String second = string.substring(length-4, length-2);
+ String therd = string.substring(length-2, length);
+ String result = first + "-" + second + "-" + therd;
+ return result;
+ }
+ /**
+ * Метод создан, для проверки работоспособности класса
+ * @param args
+ */
+ public static void main(String[] args) {
+ Number number = new Number("123-34-45");
+ System.out.println(number.toString());
+ number.print();
+ }
+}
diff --git a/java/lessons/src/main/java/ru/molokoin/j120/lab01/task1/vers03/Phone.java b/java/lessons/src/main/java/ru/molokoin/j120/lab01/task1/vers03/Phone.java
new file mode 100644
index 0000000..da09a65
--- /dev/null
+++ b/java/lessons/src/main/java/ru/molokoin/j120/lab01/task1/vers03/Phone.java
@@ -0,0 +1,239 @@
+package ru.molokoin.j120.lab01.task1.vers03;
+
+import java.util.regex.Pattern;
+import java.util.Arrays;
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.Objects;
+import java.util.Set;
+
+public class Phone{
+ private Code code;
+ private Number number;
+
+ /**
+ * Основной конструктор класса Phone
+ * @param code чтобы установить значение поля code
+ * @param number чтобы установить значение поля number
+ */
+ public Phone(Code code, Number number){
+ setCode(code);
+ setNumber(number);
+ }
+ /**
+ * Конструктор класса Phone, принимающий строковое значение номера телефона
+ * Разбивает строку на две части: code, number и передает их в конструкторы соответствующих классов,
+ * @param stringPhone
+ */
+ public Phone(String stringPhone){
+ String[] phone = stringPhone.split(Pattern.quote(")"));
+ code = new Code(phone[0]);
+ setCode(code);
+ number = new Number(phone[1]);
+ setNumber(number);
+ }
+ /**
+ * @param code the code to set
+ */
+ public void setCode(Code code) {
+ this.code = code;
+ }
+ /**
+ * @return the code
+ */
+ public Code getCode() {
+ return code;
+ }
+ /**
+ * @param number the number to set
+ */
+ public void setNumber(Number number) {
+ this.number = number;
+ }
+ /**
+ * @return the number
+ */
+ public Number getNumber() {
+ return number;
+ }
+
+ /**
+ * Переопределенный (@Override) метод класса Object,
+ * Проводит сравнение объекта у которого вызывается с переданным в качестве параметра метода объектом.
+ * Рекомендовано: всегда переопределять этот метод.
+ */
+ @Override
+ public boolean equals(Object o){
+ /**
+ * Проверка, является ли переданный объект тем же,
+ * у которого был вызван метод equals()
+ */
+ if (this == o) return true;
+ /**
+ * Проверяем, был ли объект, переданный в метод создан на основании класса Phone
+ */
+ if(!(o instanceof Phone)) return false;
+ Phone phone = (Phone) o;
+ /**
+ * Провеяем, совпадают ли значения полей объекта у которого был вызван метод
+ * со значениями одноименных полей переданного в метод объекта
+ */
+ if ((this.code.getValue() == phone.code.getValue())&&(this.number.getValue() == phone.number.getValue())) return true;
+ int i = 0;
+ boolean bool = true;
+ while(i < Phone.toIntArray(this).length){
+ if(Phone.toIntArray(this)[i] != Phone.toIntArray(phone)[i]){
+ bool = false;
+ }
+ i++;
+ }
+ if(bool)return true;
+ return false;
+ }
+ /**
+ * Статический метод, преобразовывает переданный в него объект класса Phone и возвращает int[]
+ * Предназначение - формирование ключевых полей, для передачи в hashMap
+ * @param phone
+ * @return
+ * TODO доделать
+ */
+ public static int[] toIntArray(Phone phone){
+ int[] code = phone.getCode().getValue();
+ int[] number = phone.getNumber().getValue();
+ int[] result = new int[code.length + number.length];
+ /**
+ * по хорошему надо найти метод, который добавляет поля нового массива к старому,
+ * но пока так сделал ...
+ */
+ int i = 0;
+ while (i < code.length){
+ result[i] = code[i];
+ i++;
+ }
+ int j = 0;
+ while(j < number.length){
+ result[i] = number[j];
+ i++;
+ j++;
+ }
+ return result;
+ }
+ /**
+ * Возвращает строковое представление полного номера, для вывода пользователю в форматах:
+ * (000)000-00-00
+ * (0000)00-00-00
+ *
+ * код региона заключен в круглые скобки
+ * секции номера телефона разделены знаками "-"
+ */
+ public String toString(){
+ return (getCode().toString() + getNumber().toString());
+ }
+ /**
+ * Статический метод, дублирующий второй конструктор класса
+ * на основании строкового представления полного номера телефона
+ * формирует объект класса Phone и возвращает его в качестве результата выполнения метода
+ * @param stringPhone для преобразования в объект Phone
+ * @return Phone
+ */
+ public static Phone ofString(String stringPhone){
+ String[] phone = stringPhone.split(Pattern.quote(")"));
+ Code code = new Code(phone[0]);
+ Number number = new Number(phone[1]);
+ return new Phone(code, number);
+ }
+ /**
+ * выводит в консоль оформленную со всеми необходимыми разделителями строку,
+ * содержащую полный номер телефона, хранящегося в текущем объекте
+ */
+ public void print(){
+ System.out.println(toString());
+ }
+ /**
+ * Возвращает уникальный(на период работы программы) идентификатор объекта,
+ * возможно, для использования в качестве ключевого поля параметризованного списка
+ */
+ public int hashCode(){
+ String s = Arrays.toString(Phone.toIntArray(this)).replaceAll(Regex.NON_DIGIT.get(), "");
+ int hash = 0;
+ try {
+ hash = Integer.parseInt(s);
+ } catch (NumberFormatException e) {
+ System.out.println("Ошибка:" + e.getMessage());
+ hash = 0;
+ }
+ return hash;
+ }
+ /**
+ * На будущее: всегда переопределяем методы:
+ * equals()
+ * hashCode()
+ * toString()
+ * @param args
+ */
+ public static void main(String[] args) {
+ Phone phone01 = new Phone("(812)337-33-13");
+ System.out.println("Code array: " + Arrays.toString(phone01.getCode().getValue()));
+ System.out.println("Number array: " + Arrays.toString(phone01.getNumber().getValue()));
+ System.out.println("Тлефон в пользовательском виде: ");
+ phone01.toString();
+ phone01.print();
+ System.out.println("hash-01 :" + phone01.hashCode());
+ System.out.println("-------------------------------");
+ Phone phone02 = new Phone("(8123)37-33-13");
+ System.out.println("Code array: " + Arrays.toString(phone02.getCode().getValue()));
+ System.out.println("Number array: " + Arrays.toString(phone02.getNumber().getValue()));
+ System.out.println("Тлефон в пользовательском виде: ");
+ phone02.toString();
+ phone02.print();
+ System.out.println("hash-02 :" + phone02.hashCode());
+ System.out.println("-------------------------------");
+ System.out.println("-------------------------------");
+ System.out.println("Проверка взаимодействия класса с Асоциироанным массивом \"HashMap\"");
+
+ //исходные номера телефонов
+ System.out.println("Исходные номера телефонов: ");
+ phone01 = new Phone("(812)337-33-13");
+ //phone02 = new Phone("(8123)12-34-45");
+ Phone phone03 = new Phone("(999)998-87-76");
+ Phone phone04 = new Phone("(9999)98-87-76");
+ phone01.print();
+ phone02.print();
+ phone03.print();
+ phone04.print();
+ System.out.println("-------------------------------");
+
+ //создаем и заполняем асоциированный массив
+ //не работает проверка уникальности ... проверяет хешкод int[], а не Phone
+ //метод equals надо доработать, чтобы в нем вызывался массив, для сравнения.
+ System.out.println("Создаем и заполняем асоциированный массив ...");
+ HashMap listMap = new HashMap<>();
+ listMap.put(phone01.hashCode(), phone01);
+ listMap.put(phone02.hashCode(), phone02);
+ listMap.put(phone03.hashCode(), phone03);
+ listMap.put(phone04.hashCode(), phone04);
+ // выводим в консоль даные массива
+ System.out.println("Выводим в консоль даные асоциированного массива ...");
+ System.out.println(listMap);
+ System.out.println("-------------------------------");
+
+ //создаем и заполняем множество
+ System.out.println("Создаем и заполняем множество ...");
+ HashSet listSet = new HashSet<>();
+ listSet.add(phone01);
+ listSet.add(phone02);
+ listSet.add(phone03);
+ listSet.add(phone04);
+ // выводим в консоль даные множества
+ System.out.println("Выводим в консоль даные множества");
+ System.out.println(listSet);
+ System.out.println("-------------------------------");
+
+ //проверка equals
+ System.out.println("phone01.equals(null)" + phone01.equals(null));
+ System.out.println("phone01.equals(phone01)" + phone01.equals(phone01));
+ System.out.println("phone01.equals(phone02)" + phone01.equals(phone02));
+ System.out.println("phone01.equals(phone03)" + phone01.equals(phone03));
+
+ }
+}
diff --git a/java/lessons/src/main/java/ru/molokoin/j120/lab01/task1/vers03/Regex.java b/java/lessons/src/main/java/ru/molokoin/j120/lab01/task1/vers03/Regex.java
new file mode 100644
index 0000000..7d6841b
--- /dev/null
+++ b/java/lessons/src/main/java/ru/molokoin/j120/lab01/task1/vers03/Regex.java
@@ -0,0 +1,43 @@
+package ru.molokoin.j120.lab01.task1.vers03;
+
+/**
+ * Перечисление содержит основные константные регулярные выражения,
+ * для применения с классами:
+ * - java.util.regex.Pattern
+ * - java.lang.String
+ */
+public enum Regex {
+ /**
+ * DIGIT.get()
+ * Регулярное выражение: [0-9]
+ * Выбираем все числовые элементы
+ */
+ DIGIT("[0-9]"),
+ /**
+ * NON_DIGIT.get()
+ * Регулярное выражение: [^0-9]
+ * Выбираем все не числовые элементы
+ */
+ NON_DIGIT("[^0-9]");
+
+ /**
+ * Поле, хранящее строковое представление регулярного выражения
+ */
+ private String regex;
+ /**
+ * Основной конструктор перечисления регулярных выражений,
+ * сопоставляет регулярное выражение с константным наименованием
+ * @param regex
+ */
+ Regex(String regex){
+ this.regex = regex;
+ }
+ /**
+ * Мтод возвращает строковое представление регулярного выражения
+ * @return
+ */
+ public String get(){
+ return regex;
+ }
+
+}
diff --git a/java/lessons/src/main/java/ru/molokoin/j120/lab01/task1/vers03/docs/class.puml b/java/lessons/src/main/java/ru/molokoin/j120/lab01/task1/vers03/docs/class.puml
new file mode 100644
index 0000000..4df0b84
--- /dev/null
+++ b/java/lessons/src/main/java/ru/molokoin/j120/lab01/task1/vers03/docs/class.puml
@@ -0,0 +1,54 @@
+@startuml
+Title "PhoneCatalog class-diagram"
+left to right direction
+interface IPart {
+ Regex regex
+ int[] getValue()
+ void setValue(int[] value)
+ int[] ofString (String string)
+ int[] ofIntArray (int[])
+ String toString()
+ void print()
+}
+class Code{
+ int[] value
+ Code()
+}
+class Number{
+ int[] value
+ Number()
+}
+Code -> IPart
+Number -> IPart
+
+interface IPhone{
+ void setCode(Code code)
+ void seNumber(Number number)
+ Code getCode()
+ Number getNumber()
+ Phone ofString(String string)
+ String toString(Phone phone)
+ int[] toIntArray(Phone phone)
+ boolean equals(Phone phone)
+}
+class Phone{
+ Code code
+ Number number
+ Phone()
+}
+
+Phone -> IPhone
+Phone *- Number
+Phone *- Code
+
+interface ICat{
+ void add(Phone phone)
+ void delete(Phone phone)
+ boolean isExist(Phone phone)
+}
+class Cat{}
+Cat -> ICat
+Phone -* Cat
+
+
+@enduml
\ No newline at end of file
diff --git a/java/lessons/src/main/java/ru/molokoin/j120/lab01/task1/vers03/docs/regex.json b/java/lessons/src/main/java/ru/molokoin/j120/lab01/task1/vers03/docs/regex.json
new file mode 100644
index 0000000..e69de29
diff --git a/java/lessons/src/main/java/ru/molokoin/j120/lab01/task2/vers01/generics/Runner.java b/java/lessons/src/main/java/ru/molokoin/j120/lab01/task2/vers01/generics/Runner.java
new file mode 100644
index 0000000..4928965
--- /dev/null
+++ b/java/lessons/src/main/java/ru/molokoin/j120/lab01/task2/vers01/generics/Runner.java
@@ -0,0 +1,128 @@
+package ru.molokoin.j120.lab01.task2.vers01.generics;
+
+public class Runner {
+ public static void main(String[] args) {
+ System.out.println("Запущен поток: " + Thread.currentThread().getName());
+ //Создание списка Integer
+ System.out.println("Создание списка Integer ... ");
+ SimplyGenericList listInteger = new SimplyGenericList(Integer.class);
+ System.out.println(listInteger.clazz);
+
+ //добавление элементов в список
+ System.out.println("Добавление данных в список ... ");
+ listInteger.addFirst(23);
+ listInteger.addLast(47);
+ listInteger.addFirst(21);
+ listInteger.addLast(50);
+ listInteger.addFirst(18);
+ listInteger.addLast(53);
+ listInteger.addFirst(12);
+ listInteger.addLast(64);
+
+ //вывод в консоль всех элементов списка
+ System.out.println("Вывод в консоль всех элементов списка ... ");
+ listInteger.printAll();
+
+ //Вывод в консоль результатов обработки списка
+ System.out.println("Вывод в консоль результатов обработки списка ...");
+
+ //печатаем первый и последний элементы списка
+ System.out.print("head ");
+ listInteger.printNode(listInteger.getHead());
+ System.out.print("tail ");
+ listInteger.printNode(listInteger.getTail());
+
+ //удаление первого элемента списка
+ System.out.println("Удаление первого элемента списка: " + listInteger.executeHead());
+ System.out.println("Итоговый список ... " );
+ listInteger.printAll();
+
+ //удаление последнего элемента списка
+ System.out.println("Удаление последнего элемента списка: " + listInteger.executeTail());
+ System.out.println("Итоговый список ... " );
+ listInteger.printAll();
+ //
+ int i = 47;
+ System.out.println("Удаление из списка полей со значением: " + i );
+ listInteger.deleteNodeByValue(i);
+ System.out.println("Итоговый список ... " );
+ listInteger.printAll();
+
+ //действия над всеми элементами списка
+ System.out.println("действия над всеми элементами списка ... " + UseMath.INCREASE );
+ listInteger.math(UseMath.INCREASE, 20);
+ System.out.println("Итоговый список ... " );
+ listInteger.printAll();
+ System.out.println("for each : sout");
+ for (Integer in : listInteger) {
+ System.out.println(in);
+ }
+ //агрегирование - суммируем элементы списка
+ System.out.println("действия над всеми элементами списка ... " + UseMath.SUM);
+ listInteger.math(UseMath.SUM, 0);
+
+
+
+ System.out.println("----------------------------------");
+ System.out.println("----------------------------------");
+ //Создание списка String
+ System.out.println("Создание списка String ... ");
+ SimplyGenericList listString = new SimplyGenericList(String.class);
+ System.out.println(listString.clazz);
+
+ //добавление элементов в список
+ System.out.println("Добавление данных в список ... ");
+ listString.addFirst("aa");
+ listString.addLast("bb");
+ listString.addFirst("cc");
+ listString.addLast("dd");
+ listString.addFirst("ee");
+ listString.addLast("ff");
+ listString.addFirst("gg");
+ listString.addLast("dd");
+
+ //вывод в консоль всех элементов списка
+ System.out.println("Вывод в консоль всех элементов списка ... ");
+ listString.printAll();
+
+ //Вывод в консоль результатов обработки списка
+ System.out.println("Вывод в консоль результатов обработки списка ...");
+
+ //печатаем первый и последний элементы списка
+ System.out.print("head ");
+ listString.printNode(listString.getHead());
+ System.out.print("tail ");
+ listString.printNode(listString.getTail());
+
+ //удаление первого элемента списка
+ System.out.println("Удаление первого элемента списка: " + listString.executeHead());
+ System.out.println("Итоговый список ... " );
+ listString.printAll();
+
+ //удаление последнего элемента списка
+ System.out.println("Удаление последнего элемента списка: " + listString.executeTail());
+ System.out.println("Итоговый список ... " );
+ listString.printAll();
+ //
+ String s = "47";
+ System.out.println("Удаление из списка полей со значением: " + s );
+ listString.deleteNodeByValue(s);
+ System.out.println("Итоговый список ... " );
+ listString.printAll();
+
+ //действия над всеми элементами списка
+ System.out.println("действия над всеми элементами списка ... " + UseMath.INCREASE );
+ listString.math(UseMath.INCREASE, "20");
+ System.out.println("Итоговый список ... " );
+ listString.printAll();
+ System.out.println("for each : sout");
+ for (String st : listString) {
+ System.out.println(st);
+ }
+ //агрегирование - суммируем элементы списка
+ System.out.println("действия над всеми элементами списка ... " + UseMath.SUM);
+ listString.math(UseMath.SUM, "");
+
+
+ }
+}
diff --git a/java/lessons/src/main/java/ru/molokoin/j120/lab01/task2/vers01/generics/SimplyGenericList.java b/java/lessons/src/main/java/ru/molokoin/j120/lab01/task2/vers01/generics/SimplyGenericList.java
new file mode 100644
index 0000000..5857813
--- /dev/null
+++ b/java/lessons/src/main/java/ru/molokoin/j120/lab01/task2/vers01/generics/SimplyGenericList.java
@@ -0,0 +1,314 @@
+package ru.molokoin.j120.lab01.task2.vers01.generics;
+
+import java.util.Iterator;
+
+/**
+ * Класс содержащий инструменты управления списком и данными в нем
+ * @param
+ */
+public class SimplyGenericList implements Iterable {
+ /**
+ * Поле элемента списка, хранит данные о первом элементе
+ */
+ private Node head;
+ /**
+ * Поле элемента списка, хранит данные о последнем элементе
+ */
+ private Node tail;
+ /**
+ * остаток не доделаной конфигурации,
+ * Хранит данные о передаваемом в список типе данных,
+ * предполагалось с помощью него реализовывать применение различных реализаций методов,
+ * в завиимости от типов передаваемых пользователем даных.
+ */
+ Class> clazz;//для определения класса, с которым пользователь использует список
+
+ /**
+ * Конструктор списка, принимающий в качестве параметра тип данных, передаваемых пользователем в список.
+ * @param clazz
+ */
+ public SimplyGenericList(Class> clazz){
+ this.clazz = clazz;
+ }
+ /**
+ * @return the head
+ */
+ public Node getHead() {
+ return head;
+ }
+ /**
+ * @param head the head to set
+ */
+ public void setHead(Node head) {
+ this.head = head;
+ }
+ /**
+ * @return the tail
+ */
+ public Node getTail() {
+ return tail;
+ }
+ /**
+ * @param tail the tail to set
+ */
+ public void setTail(Node tail) {
+ this.tail = tail;
+ }
+ /**
+ * Добавление элемента в начало списка
+ * @param data
+ */
+ public void addFirst(T data){
+ if(head == null){
+ head = new Node();
+ head.data = (T)data;
+ tail = head;
+ }else{
+ Node tmp = new Node();
+ tmp.data = (T)data;
+ tmp.next = head;
+ head = tmp;
+ }
+ }
+ /**
+ * Добавление нового элемента в конец списка
+ */
+ public void addLast(T data){
+ if(head == null){
+ addFirst((T)data);
+ }else{
+ Node tmp = new Node();
+ tmp.data = (T)data;
+ tail.next = tmp;
+ tail = tmp;
+ }
+ }
+ /**
+ * удаляет первый элемент списка и возвращает его данные
+ * @return
+ * TODO вдруг список пустой
+ * TODO вдруг список содержит только один элемент
+ */
+ public T executeHead(){
+ T tmp = null;
+ tmp = (T)head.data;
+ head = head.next;
+ return tmp;
+ }
+ /**
+ * Удаление последнего элемента списка
+ * @return
+ */
+ public T executeTail(){
+ T tmp = (T)tail.data;//готовы писать данные удаляемого элемента
+ Node bufNode = head;
+ //у предпоследнего элемента удаляем ссылку на tail
+ while (bufNode.next != tail){
+ bufNode = bufNode.next;
+ }
+ bufNode.next = null;
+ return tmp;
+ }
+ /**
+ * Преобразование массива в односвязный список
+ * @param array
+ * @return
+ * TODO в перспективе сделать преобразование массива
+ * */
+ public SimplyGenericList arrayToList(T[] array){
+ SimplyGenericList sl = new SimplyGenericList(clazz);
+ return sl;
+ }
+ /**
+ * вывод в консоль всех элементов списка, по порядку
+ */
+ public void printAll(){
+ Node temp = head;
+ while (temp != null){
+ printNode(temp);
+ temp = temp.next;
+ }
+ }
+ /**
+ * Вывод в консоль данных указанной ноды
+ * @param node
+ */
+ public void printNode(Node node){
+ if (node == null){
+ System.out.println(">>> " + null);
+
+ }else{
+ System.out.println(">>> " + (T)node.data);
+ }
+ }
+ public void deleteNodeByValue(T value){
+ //обработка случая, когда первый элемент списка подлежит удалению
+ while (head.data == (T)value){
+ head = head.next;
+ }
+ //первый элемент списка точно не подлежит удалению
+ Node buf = new Node();
+ buf = head;
+ while(buf.next != null){
+ if (buf.next.data != (T)value){
+ buf = buf.next;
+ }else{
+ buf.next = buf.next.next;
+ }
+ }
+ }
+ /**
+ * не понятно почему не работает,
+ * оператор "+" не предусмотрен для объектов класса Т
+ * как предусмотреть ???
+ * можно попробовать сделать еще один свитч по типу данных, передаваемых пользователем в список,
+ * но поля в списке всеравно окажутся и к ним не понятно как получать доступ.
+ * с агрегированием аналогичная ситуация
+ * @param use
+ * @param value
+ */
+
+ public void math(UseMath use, T value){
+ try{
+ switch (use){
+ case SUM :{
+ Node buf = head;
+ if (buf.data instanceof String){
+ /**
+ * работает быстрее, потомучто под капотом static поля,
+ * обработка идет в стеке
+ */
+ StringBuilder mid = new StringBuilder(buf.toString());
+ while (buf.next != null){
+ mid = mid.append(buf.next.toString()) ;
+ buf = buf.next;
+ }
+ System.out.println("SUM-String: " + mid);
+ }
+ /**
+ * тоже работает
+ */
+ // if (buf.data instanceof String){
+ // String mid = buf.toString();
+ // while (buf.next != null){
+ // mid = "" +mid + buf.next.toString();
+ // buf = buf.next;
+ // }
+ // System.out.println("SUM-String: " + mid);
+ // }
+
+ //по той же причине mid объявлен как int
+ if (buf.data instanceof Integer){
+ int mid = buf.toInteger();
+ while (buf.next != null){
+ mid = mid + buf.next.toInteger();
+ buf = buf.next;
+ }
+ System.out.println("SUM-INTEGER: " + mid);
+ }
+
+ break;
+ }
+ case INCREASE : {
+ Node buf = head;
+ if (buf.data instanceof Number){
+ Integer midl = buf.toInteger() + (Integer)value;
+ System.out.println("(Integer)mid :" + midl);
+ buf.data = (T)midl;
+ while (buf.next != null){
+ midl = buf.next.toInteger() + (Integer)value;
+ buf.next.data = (T)midl;
+ buf = buf.next;
+ }
+ }
+ if (buf.data instanceof String){
+ String midl = buf.toString() + (String)value;
+ System.out.println("(String)mid :" + midl);
+ buf.data = (T)midl;
+ while (buf.next != null){
+ midl = buf.next.toString() + (String)value;
+ buf.next.data = (T)midl;
+ buf = buf.next;
+ }
+ }
+ break;
+ }
+ case DECREASE : {
+ break;
+ }
+ }
+ }catch(Exception e){
+ System.out.println(e.getMessage());
+ }
+ }
+ /**
+ * Метод интерфейса Iterable, рализует функционирование итератора,
+ * возможность перебора списка циклом foreach
+ */
+ @Override
+ public Iterator iterator(){
+ return new SimplyGenericListIterator(head);
+ }
+ public int size() {
+ int index = 1;
+ Node current = head;
+ while (current.next != null){
+ current = current.next;
+ index++;
+ }
+ return index;
+ }
+
+ /**
+ * Класс, объекты которого являются элементами списка (узлы / ноды / node) в которых хранятся основные данные и ссылка на следующий элемент списка.
+ * не понятно, почему создаются объекты, если класс статический ...
+ */
+ public static class Node{
+ private T data;
+ private Node next;
+
+ public Integer toInteger(){
+ if (data instanceof Integer){
+ return (Integer)data;
+ }else{
+ throw new IllegalArgumentException("IllegalArgumentException: даные не относятся к типу Integer");
+ }
+ }
+ public String toString(){
+ if (data instanceof String){
+ return (String)data;
+ }else{
+ throw new IllegalArgumentException("IllegalArgumentException: даные не относятся к типу String");
+ }
+ }
+ }
+
+ /**
+ * Класс, устанавливающий методы рализации интерфейса Iterator,
+ * устанавливает методы, испльзуемые при реализации метода iterator() интерфейса Iterable
+ * !! скопировал рализацию с практики, на много проще моей получилась ..
+ */
+ public static class SimplyGenericListIterator implements Iterator {
+ Node nextNode;
+
+ /**
+ * Конструктор итератора, передаем в него головную ноду.
+ * @param nextNode
+ */
+ public SimplyGenericListIterator(Node nextNode) {
+ this.nextNode = nextNode;
+ }
+ @Override
+ public boolean hasNext() {
+ if(nextNode!=null) return true;
+ return false;
+ }
+ @Override
+ public T next() {
+ T value = (T)nextNode.data;
+ nextNode = nextNode.next;
+ return value;
+ }
+ }
+
+}
diff --git a/java/lessons/src/main/java/ru/molokoin/j120/lab01/task2/vers01/generics/UseMath.java b/java/lessons/src/main/java/ru/molokoin/j120/lab01/task2/vers01/generics/UseMath.java
new file mode 100644
index 0000000..4d155c3
--- /dev/null
+++ b/java/lessons/src/main/java/ru/molokoin/j120/lab01/task2/vers01/generics/UseMath.java
@@ -0,0 +1,8 @@
+package ru.molokoin.j120.lab01.task2.vers01.generics;
+
+public enum UseMath {
+ SUM,
+ INCREASE,
+ DECREASE;
+
+}
diff --git a/java/lessons/src/main/java/ru/molokoin/j120/lab01/task2/vers01/samples/LinkedList.java b/java/lessons/src/main/java/ru/molokoin/j120/lab01/task2/vers01/samples/LinkedList.java
new file mode 100644
index 0000000..b6f2c6c
--- /dev/null
+++ b/java/lessons/src/main/java/ru/molokoin/j120/lab01/task2/vers01/samples/LinkedList.java
@@ -0,0 +1,97 @@
+package ru.molokoin.j120.lab01.task2.vers01.samples;
+
+import java.util.Iterator;
+
+public class LinkedList implements Iterable{
+ private Node head;
+ private Node tail;
+
+ public LinkedList(){}
+
+ //Добавление элемента в конец списка
+ public void add(T item){
+ if(head==null){
+ head = new Node();
+ tail = head;
+ head.data = item;
+ }
+ else {
+ Node tempNode = new Node();
+ tempNode.data = item;
+ tempNode.previous = tail;
+ tail.next = tempNode;
+ tail = tempNode;
+ }
+ }
+
+ //Получение значения элемента по его индексу
+ public T get(int index){
+ if(index<0) throw new IllegalArgumentException();
+ int tempIndex = 0;
+ Node tempNode = head;
+ while(tempNode!=null){
+ if(tempIndex==index) return (T)tempNode.data;
+ tempNode = tempNode.next;
+ tempIndex++;
+ }
+ throw new IndexOutOfBoundsException();
+ }
+
+ //Получение размера списка
+ public int size(){
+ int size = 0;
+ Node tempNode = head;
+ while (tempNode!=null){
+ size++;
+ tempNode = tempNode.next;
+ }
+ return size;
+ }
+
+ //Получение первого элемента
+ public T getHead(){
+ if(head==null) return null;
+ return (T)head.data;
+ }
+
+ //Получение последнего элемента
+ public T getTail(){
+ if(tail==null) return null;
+ return (T)tail.data;
+ }
+
+ @Override
+ public Iterator iterator() {
+ return new LinkedIterator<>(head);
+ }
+
+ private static class LinkedIterator implements Iterator{
+ Node nextNode;
+
+ public LinkedIterator(Node nextNode) {
+ this.nextNode = nextNode;
+ }
+
+
+ @Override
+ public boolean hasNext() {
+ if(nextNode!=null) return true;
+ return false;
+ }
+
+ @Override
+ public T next() {
+ T value = (T)nextNode.data;
+ nextNode = nextNode.next;
+ return value;
+ }
+
+ }
+
+ //Внутренний класс, хранящий полезное значение и ссылки на следующий узел и предыдущий
+ private static class Node {
+ T data;
+ Node next;
+ Node previous;
+ }
+}
diff --git a/java/lessons/src/main/java/ru/molokoin/j120/lab01/task2/vers01/samples/MainClass.java b/java/lessons/src/main/java/ru/molokoin/j120/lab01/task2/vers01/samples/MainClass.java
new file mode 100644
index 0000000..a7bc213
--- /dev/null
+++ b/java/lessons/src/main/java/ru/molokoin/j120/lab01/task2/vers01/samples/MainClass.java
@@ -0,0 +1,38 @@
+package ru.molokoin.j120.lab01.task2.vers01.samples;
+
+import java.util.Iterator;
+
+public class MainClass {
+
+ public static void main(String[] args) {
+ LinkedList list = new LinkedList<>();
+ list.add(5);
+ list.add(15);
+ list.add(23);
+ list.add(45);
+ list.add(432);
+ list.add(67);
+ list.add(87);
+ list.add(124);
+ System.out.println("Last item = " + list.getTail());
+ System.out.println("Index item = " + list.get(7));
+ System.out.println("List size = " + list.size());
+
+ System.out.println("Вывод с помощью метода forEach");
+ list.forEach(e -> System.out.print(e + ", "));
+ Iterator iter = list.iterator();
+ System.out.println();
+
+ System.out.println("Вывод с помощью итератора");
+
+ while(iter.hasNext()){
+ System.out.print(iter.next() + ", ");
+ }
+ System.out.println();
+
+ System.out.println("Вывод с помощью цикла forEach");
+ for(Integer num : list){
+ System.out.print(num + ", ");
+ }
+ }
+}
diff --git a/java/lessons/src/main/java/ru/molokoin/j120/lab01/task3/person/Degree.java b/java/lessons/src/main/java/ru/molokoin/j120/lab01/task3/person/Degree.java
new file mode 100644
index 0000000..b01d57f
--- /dev/null
+++ b/java/lessons/src/main/java/ru/molokoin/j120/lab01/task3/person/Degree.java
@@ -0,0 +1,17 @@
+package ru.molokoin.j120.lab01.task3.person;
+
+public enum Degree {
+ PhD {
+ @Override
+ public String getDegree() {
+ return "PhD";
+ }
+ },
+ MSc {
+ @Override
+ public String getDegree() {
+ return "MSc";
+ }
+ };
+ public abstract String getDegree();
+}
diff --git a/java/lessons/src/main/java/ru/molokoin/j120/lab01/task3/person/Gender.java b/java/lessons/src/main/java/ru/molokoin/j120/lab01/task3/person/Gender.java
new file mode 100644
index 0000000..cbf878e
--- /dev/null
+++ b/java/lessons/src/main/java/ru/molokoin/j120/lab01/task3/person/Gender.java
@@ -0,0 +1,39 @@
+package ru.molokoin.j120.lab01.task3.person;
+/**
+ * Перечисление gender,
+ *
+ */
+public enum Gender {
+ MALE {
+ public String getPronoun(){
+ return "he";
+ }
+
+ @Override
+ public String getPronounOwn() {
+ return "his";
+ }
+ },
+ FEMALE{
+ public String getPronoun(){
+ return "she";
+ }
+ @Override
+ public String getPronounOwn() {
+ return "her";
+ }
+
+ },
+ TRANS{
+ public String getPronoun() {
+ return "it";
+ }
+
+ @Override
+ public String getPronounOwn() {
+ return "its";
+ }
+ };
+ public abstract String getPronoun();
+ public abstract String getPronounOwn();
+}
diff --git a/java/lessons/src/main/java/ru/molokoin/j120/lab01/task3/person/Person.java b/java/lessons/src/main/java/ru/molokoin/j120/lab01/task3/person/Person.java
new file mode 100644
index 0000000..a0491e5
--- /dev/null
+++ b/java/lessons/src/main/java/ru/molokoin/j120/lab01/task3/person/Person.java
@@ -0,0 +1,246 @@
+package ru.molokoin.j120.lab01.task3.person;
+
+import java.util.ArrayList;
+import java.util.List;
+
+public class Person {
+ private String name;
+ private Gender gender;
+ private String department;
+ private Role role;
+ //для аспиранта
+ private String thesisTitle;
+ //для преподавателя
+ private Degree degree;
+ private String speciality;
+ //для студента
+ private Stage stage;
+ private String course;
+
+ /**
+ * Создаем персону
+ * @param name
+ * @param gender
+ * @param department
+ * @param role
+ */
+ Person(String name, Gender gender, String department, Role role){
+ setName(name);
+ setGender(gender);
+ setDepartment(department);
+ setRole(role);
+ }
+ /**
+ * Создаем аспиранта
+ * @param name
+ * @param gender
+ * @param department
+ * @param role
+ * @param thesisTitle
+ */
+ Person(String name, Gender gender, String department, Role role, String thesisTitle){
+ this(name, gender, department, role);
+ setThesisTitle(thesisTitle);
+ }
+
+ /**
+ * Создаем преподавателя
+ * @param name
+ * @param gender
+ * @param department
+ * @param role
+ * @param degree
+ * @param speciality
+ */
+ Person(String name, Gender gender, String department, Role role, Degree degree, String speciality){
+ this(name, gender, department, role);
+ setDegree(degree);
+ setSpeciality(speciality);
+ }
+
+ /**
+ * Создаем студента
+ * @param name
+ * @param gender
+ * @param department
+ * @param role
+ * @param stage
+ * @param course
+ */
+ Person(String name, Gender gender, String department, Role role, Stage stage, String course){
+ this(name, gender, department, role);
+ setStage(stage);
+ setCourse(course);
+ }
+
+ public static Person[] initDefaults(){
+ Person[] defaultList = new Person[6];
+
+ defaultList[0] = new Person("Ronald Turner", Gender.MALE, "Computer science",
+ Role.TEACHER, Degree.PhD, "Programming paradigms");
+
+ defaultList[1] = new Person("Ruth Hollings", Gender.FEMALE, "Jurisprudence",
+ Role.TEACHER, Degree.MSc, "Domestic arbitration");
+
+ defaultList[2] = new Person("Leo Wilkinson", Gender.MALE, "Computer science", Role.STUDENT, Stage.bachelor, "III");
+
+ defaultList[3] = new Person("Anna Cunningham", Gender.FEMALE, "World economy", Role.STUDENT, Stage.bachelor, "I");
+
+ defaultList[4] = new Person("Jill Lundqvist", Gender.FEMALE, "Jurisprudence", Role.STUDENT, Stage.master, "I");
+
+ defaultList[5] = new Person("Ronald Correa", Gender.MALE, "Computer science", Role.ASPIRANT, "Design of a functional programming language.");
+
+ return defaultList;
+ }
+ public static List initPersons(){
+ List list = new ArrayList<>();
+ list.add(new Person("Ronald Turner", Gender.MALE, "Computer science",
+ Role.TEACHER, Degree.PhD, "Programming paradigms"));
+
+ list.add(new Person("Ruth Hollings", Gender.FEMALE, "Jurisprudence",
+ Role.TEACHER, Degree.MSc, "Domestic arbitration"));
+
+ list.add(new Person("Leo Wilkinson", Gender.MALE, "Computer science", Role.STUDENT, Stage.bachelor, "III"));
+
+ list.add(new Person("Anna Cunningham", Gender.FEMALE, "World economy", Role.STUDENT, Stage.bachelor, "I"));
+
+ list.add(new Person("Jill Lundqvist", Gender.FEMALE, "Jurisprudence", Role.STUDENT, Stage.master, "I"));
+
+ list.add(new Person("Ronald Correa", Gender.MALE, "Computer science", Role.ASPIRANT, "Design of a functional programming language."));
+ return list;
+ }
+ /**
+ * Выводит общие данные в консоль
+ */
+ public void print(){
+ System.out.println("This is " + getName() + " " +
+ getGender().getPronoun() + " " +
+ getRole().getVerb() + " at " + getDepartment());
+ //преподаватели
+ if (getRole().equals(Role.TEACHER)){
+ System.out.println(getGender().getPronoun() + " has " +
+ getDegree() + " degree in " +
+ getSpeciality() + ".");
+ System.out.println();
+ }
+ //студенты
+ if (getRole().equals(Role.STUDENT)){
+ System.out.println(getGender().getPronoun() + " is " +
+ getCourse() + "‘th year " + getStage() + " student.");
+ System.out.println();
+ }
+
+ //аспиранты
+ if (getRole().equals(Role.ASPIRANT)){
+ System.out.println(getGender().getPronounOwn() + " thesis title is " + getThesisTitle() + ".");
+ System.out.println();
+ }
+ }
+ /**
+ * Выводит полный набор данных в консоль
+ * @param persons массив элементов Person, для печати в консоль
+ */
+ public static void printAll(Person[] persons){
+ int i = 0;
+ while (i < persons.length){
+ persons[i].print();
+ i++;
+ }
+ }
+ /**
+ * Метод принимает параметризованную коллекцию,
+ * перебирает foreach все элементы и вызывает методы print() у каждого элемента.
+ * !!!чтобы передавать параметризованную коллекцию, ее нужно заранее создать
+ */
+ public static void printAll(List extends Person> list){
+ for (Person person : list) {
+ person.print();
+ }
+ }
+
+ /**
+ * Устанавливает значение поля name/Фамилия, Имя и Отчество человека
+ * @param name
+ * не может быть пустым, если передано пустое значение, устанавливается значение noname
+ */
+ public void setName(String name) {
+ this.name = name;
+ }
+ public void setGender(Gender gender) {
+ this.gender = gender;
+ }
+ public void setDepartment(String department) {
+ this.department = department;
+ }
+ public void setRole(Role role) {
+ this.role = role;
+ }
+ public void setThesisTitle(String thesisTitle) {
+ this.thesisTitle = thesisTitle;
+ }
+ public void setDegree(Degree degree) {
+ this.degree = degree;
+ }
+ public void setSpeciality(String speciality) {
+ this.speciality = speciality;
+ }
+ public void setStage(Stage stage) {
+ this.stage = stage;
+ }
+ public void setCourse(String course) {
+ this.course = course;
+ }
+ /**
+ * Возвращает имя человека,
+ * TODO имя не может быть пустым полем или отсутствовать
+ * @return
+ */
+ public String getName() {
+ return name;
+ }
+ /**
+ * возвращает пол/gender человека мужской/male или женский/female
+ * @return
+ *
+ */
+ public Gender getGender() {
+ return gender;
+ }
+ /**
+ * Возвращает наименование департамента, в котором трудится человек (учится или преподает)
+ * @return
+ *
+ */
+ public String getDepartment() {
+ return department;
+ }
+ public Role getRole() {
+ return role;
+ }
+ public String getThesisTitle() {
+ return thesisTitle;
+ }
+ public Degree getDegree() {
+ return degree;
+ }
+ public String getSpeciality() {
+ return speciality;
+ }
+ public Stage getStage() {
+ return stage;
+ }
+ public String getCourse() {
+ return course;
+ }
+ public static void main(String[] args) {
+ System.out.println("----------------------------");
+ System.out.println("Печать из массива ...");
+ Person.printAll(Person.initDefaults());
+ System.out.println("----------------------------");
+ System.out.println("Печать из параметризованного списка >>>Persons<<<");
+ Person.printAll(Person.initPersons());
+ System.out.println("----------------------------");
+ System.out.println("Печать из параметризованного списка >>>Personable<<<");
+ Person.printAll(Personable.initPersonables());
+ }
+}
diff --git a/java/lessons/src/main/java/ru/molokoin/j120/lab01/task3/person/Personable.java b/java/lessons/src/main/java/ru/molokoin/j120/lab01/task3/person/Personable.java
new file mode 100644
index 0000000..18e7f57
--- /dev/null
+++ b/java/lessons/src/main/java/ru/molokoin/j120/lab01/task3/person/Personable.java
@@ -0,0 +1,38 @@
+package ru.molokoin.j120.lab01.task3.person;
+
+import java.util.ArrayList;
+import java.util.List;
+
+public class Personable extends Person{
+ Personable(String name, Gender gender, String department, Role role){
+ super(name, gender, department, role);
+ }
+ Personable(String name, Gender gender, String department, Role role, String thesisTitle){
+ super(name, gender, department, role);
+ }
+ Personable(String name, Gender gender, String department, Role role, Degree degree, String speciality) {
+ super(name, gender, department, role, degree, speciality);
+ }
+ Personable(String name, Gender gender, String department, Role role, Stage stage, String course){
+ super(name, gender, department, role, stage, course);
+ }
+
+ public static List initPersonables(){
+ List list = new ArrayList<>();
+ list.add(new Personable("Ronald Turner", Gender.MALE, "Computer science",
+ Role.TEACHER, Degree.PhD, "Programming paradigms"));
+
+ list.add(new Personable("Ruth Hollings", Gender.FEMALE, "Jurisprudence",
+ Role.TEACHER, Degree.MSc, "Domestic arbitration"));
+
+ list.add(new Personable("Leo Wilkinson", Gender.MALE, "Computer science", Role.STUDENT, Stage.bachelor, "III"));
+
+ list.add(new Personable("Anna Cunningham", Gender.FEMALE, "World economy", Role.STUDENT, Stage.bachelor, "I"));
+
+ list.add(new Personable("Jill Lundqvist", Gender.FEMALE, "Jurisprudence", Role.STUDENT, Stage.master, "I"));
+
+ list.add(new Personable("Ronald Correa", Gender.MALE, "Computer science", Role.ASPIRANT, "Design of a functional programming language."));
+ return list;
+ }
+
+}
diff --git a/java/lessons/src/main/java/ru/molokoin/j120/lab01/task3/person/Role.java b/java/lessons/src/main/java/ru/molokoin/j120/lab01/task3/person/Role.java
new file mode 100644
index 0000000..949e276
--- /dev/null
+++ b/java/lessons/src/main/java/ru/molokoin/j120/lab01/task3/person/Role.java
@@ -0,0 +1,23 @@
+package ru.molokoin.j120.lab01.task3.person;
+
+public enum Role {
+ STUDENT {
+ @Override
+ public String getVerb() {
+ return "studies";
+ }
+ },
+ ASPIRANT {
+ @Override
+ public String getVerb() {
+ return "studies";
+ }
+ },
+ TEACHER {
+ @Override
+ public String getVerb() {
+ return "teaches";
+ }
+ };
+ public abstract String getVerb();
+}
diff --git a/java/lessons/src/main/java/ru/molokoin/j120/lab01/task3/person/Stage.java b/java/lessons/src/main/java/ru/molokoin/j120/lab01/task3/person/Stage.java
new file mode 100644
index 0000000..843ada7
--- /dev/null
+++ b/java/lessons/src/main/java/ru/molokoin/j120/lab01/task3/person/Stage.java
@@ -0,0 +1,17 @@
+package ru.molokoin.j120.lab01.task3.person;
+
+public enum Stage {
+ bachelor {
+ @Override
+ public String getStage() {
+ return "bachelor";
+ }
+ },
+ master {
+ @Override
+ public String getStage() {
+ return "master";
+ }
+ };
+ public abstract String getStage();
+}
diff --git a/java/lessons/src/main/java/ru/molokoin/j120/lab01/task4/RegularStudent.java b/java/lessons/src/main/java/ru/molokoin/j120/lab01/task4/RegularStudent.java
new file mode 100644
index 0000000..9138739
--- /dev/null
+++ b/java/lessons/src/main/java/ru/molokoin/j120/lab01/task4/RegularStudent.java
@@ -0,0 +1,5 @@
+package ru.molokoin.j120.lab01.task4;
+
+public class RegularStudent {
+
+}
diff --git a/java/lessons/src/main/java/ru/molokoin/j120/lab01/task4/task.md b/java/lessons/src/main/java/ru/molokoin/j120/lab01/task4/task.md
new file mode 100644
index 0000000..f7903fb
--- /dev/null
+++ b/java/lessons/src/main/java/ru/molokoin/j120/lab01/task4/task.md
@@ -0,0 +1,8 @@
+# 4. Заполнение параметризованной коллекции.
+**Реализуйте в классе RegularStudent из соответствующей задачи 110-го курса статический метод:**
+* заполняющий заданную коллекцию типа Collection данными о некоторых студентах (например: данными, приведёнными в примере в задаче 110-го курса).
+* Сделайте так, чтобы метод мог корректно использоваться как с коллекциями типа Сollection,
+* так и с коллекциями, параметризованными другими типами.
+* Подумайте, какими типами может быть параметризована такая коллекция.
+* Проиллюстрируйте использование метода.
+* **Доработайте класс односвязного списка, чтобы методы «выполнять заданное действие» и «агрегировать значения» соответствовали правилам PECS при использовании вспомогательных типов.**
\ No newline at end of file
diff --git a/java/lessons/src/main/java/ru/molokoin/j120/lab01/task5/DoublyGenericList.java b/java/lessons/src/main/java/ru/molokoin/j120/lab01/task5/DoublyGenericList.java
new file mode 100644
index 0000000..f6bd695
--- /dev/null
+++ b/java/lessons/src/main/java/ru/molokoin/j120/lab01/task5/DoublyGenericList.java
@@ -0,0 +1,432 @@
+package ru.molokoin.j120.lab01.task5;
+
+import java.util.ArrayList;
+import java.util.Iterator;
+
+public class DoublyGenericList implements Iterable, Cloneable{
+ private Node head = null;
+ private Node tail = null;
+
+ /**
+ * метод проверяет пустой ли список и в случае,
+ * если в списке нет узла head, возвращает true.
+ * Если узел head есть, но в нем отсудствую данные, также возвращается true.
+ * @return true, если список пуст
+ */
+ public boolean isEmpty(){
+ boolean isEmpty = false;
+ if((getHead() != null) || (getTail() != null)){
+ isEmpty = false;
+ }else{
+ isEmpty = true;
+ }
+ return isEmpty;
+ }
+ /**
+ * добавление данных в начало списка
+ * @param data
+ */
+ public void addFirst(T data){
+ if (isEmpty()) {
+ Node newNode = new Node();
+ newNode.data = data;
+ setHead(newNode);
+ setTail(newNode);
+ }else{
+ Node newNode = new Node();
+ newNode.data = data;
+ newNode.forvard = getHead();
+ getHead().backvard = newNode;
+ setHead(newNode);
+ }
+ }
+ /**
+ * добавление данных в конец списка
+ * @param data
+ */
+ public void addLast(T data){
+ if (isEmpty()) {
+ Node newNode = new Node();
+ newNode.data = data;
+ setHead(newNode);
+ setTail(newNode);
+ }else{
+ Node newNode = new Node();
+ newNode.data = data;
+ newNode.backvard = getTail();
+ getTail().forvard = newNode;
+ setTail(newNode);
+ }
+ }
+ /**
+ * вывод в консоль всех элементов списка, по порядку
+ * метод скопирован с односвязных списков
+ */
+ public void printForvard(){
+ Node tmp = getHead();
+ while (tmp != null){
+ printNode(tmp);
+ tmp = tmp.forvard;
+ }
+ }
+ public void printBackvard(){
+ Node tmp = getTail();
+ while(tmp != null){
+ printNode(tmp);
+ tmp = tmp.backvard;
+ }
+ }
+ /**
+ * Вывод в консоль данных указанной ноды
+ * Метод скопирован с односвязных списков
+ * @param node
+ */
+ public void printNode(Node node){
+ if (node == null){
+ System.out.println(">>> " + null);
+
+ }else{
+ System.out.println(">>> " + node.data);
+ }
+ }
+ /**
+ * извлечение данных с удалением первого элемента списка
+ * TODO исключения, когда список пустой
+ * @return
+ */
+ public T executeFirst(){
+ T executed = null;
+ if (isEmpty()){
+ return executed;
+ }
+ else{
+ try {
+ executed = (T) getHead().data;
+ setHead(getHead().forvard);
+ }catch (NullPointerException e){
+ System.out.println("Обнаружена исключительная ситуация: " + e);
+ }
+ }
+ return executed;
+ }
+ /**
+ * извлечение данных с удалением последнего элемента списка
+ * @return
+ */
+ public T executeLast(){
+ T executed = null;
+ if (isEmpty()){
+ return executed;
+ }
+ else{
+ try {
+ executed = (T)getTail().data;
+ setTail(getTail().backvard);
+ getTail().forvard = null;
+ }catch (NullPointerException e){
+ System.out.println("Обнаружена исключительная ситуация: " + e);
+ }
+ }
+ return executed;
+ }
+ /**
+ * Проверяем наличие в списке заданного в параметре метода значения
+ * @param value
+ * @return
+ */
+ public boolean isContain(T value){
+ boolean isContain = false;
+ if (isEmpty()){
+ isContain = false;
+ return isContain;
+ }
+ else{
+ Node tmp = getHead();
+ while (tmp.forvard != null){
+ if(tmp.data == value){
+ isContain = true;
+ }
+ tmp = tmp.forvard;
+ }
+ if (getTail().data == value){
+ isContain = true;
+ }
+ }
+ return isContain;
+ }
+ /**
+ * удаляем ноды, содержащие данные совпадающие с указанным в методе значением
+ * @param value
+ */
+ public void deleteByValue(T value){
+ //проверяем наличие указанного значения в списке
+ if (isContain(value)){
+ //удаляем первые ноды, если они содержат указанное значение
+ Node tmp = getHead();
+ while (tmp.data == value){
+ executeFirst();
+ tmp = getHead();
+ }
+ //удаляем последние ноды, если они содержат указанное значение
+ tmp = getTail();
+ while(tmp.data == value){
+ executeLast();
+ tmp = getTail();
+ }
+ /**
+ * первая и последняя ноды точно не содержат указанное значение и не подлежат удалению
+ */
+ tmp = getHead();
+ //
+ while (tmp.forvard != null){
+ //если данные текущей ноды не подлежат удалению, переходим к следующей ноде
+ if (tmp.data != value){
+ tmp = tmp.forvard;
+ }
+ /**
+ * если текущая нода подлежит удалению
+ * (точно не первая и не последняя)
+ *
+ */
+ else{
+ tmp.forvard.backvard = tmp.backvard;
+ tmp.backvard.forvard = tmp.forvard;
+ tmp = tmp.forvard;
+ }
+ }
+ }
+ }
+ /**
+ * добавление элементов массива в начало списка
+ * чтобы обеспечить последовательное размещение элементов массива в списке, элементы добавляются с последнего элемента массива
+ * @param array
+ */
+ public void arrayToHead(T[]array){
+ int i = array.length-1;
+ while (i >= 0){
+ addFirst(array[i]);
+ i--;
+ }
+ }
+ /**
+ * добавление элементов массива в хвост списка
+ * @param array
+ */
+ public void arrayToTail(T[]array){
+ int i = 0;
+ while (i < array.length){
+ addLast(array[i]);
+ i++;
+ }
+ }
+ /**
+ * добавление коллекции в начало списка
+ * @param collection
+ */
+ public void collectionToHead(ArrayList collection){
+ for(int i = (collection.size()-1);i >= 0;i--) {
+ addFirst(collection.get(i));
+ }
+ }
+ /**
+ * добавление коллекции в хвост списка
+ * @param collection
+ */
+ public void collectionToTail(ArrayList collection){
+ for(T c : collection){
+ addLast(c);
+ }
+ }
+ public Node getHead() throws NullPointerException {
+ return head;
+ }
+ public void setHead(Node head) {
+ this.head = head;
+ }
+ public Node getTail() throws NullPointerException{
+ return tail;
+ }
+ public void setTail(Node tail) {
+ this.tail = tail;
+ }
+
+ /**
+ * метод возвращает список,
+ * в котором элеметы расположены в обратной последовательности
+ * TODO метод может возвращать void, а в теле еще одним циклом переписывать текущий список.
+ * хотя и сейчас можно текущему списку присвоить преобразованный список.
+ * list = list.reverce();
+ * .. в общем шило на мыло, меняется только способ использования метода.
+ * рально в reverce() обращаться к объектам исходного списка только при клонировании элементов списка,
+ * но сам список при этом всеровно окажется новым экземпляром.
+ * @return
+ */
+ public DoublyGenericList reverce(){
+ DoublyGenericList reverce = new DoublyGenericList<>();
+ for (T t : this) {
+ reverce.addFirst(t);
+ }
+ return reverce;
+ }
+
+ /**
+ * Возвращает количество звеньев в текущем списке
+ * @return
+ */
+ private int size() {
+ Node next = head;
+ int i = 0;
+ while (next.forvard != null){
+ i++;
+ next = next.forvard;
+ }
+ return i + 1;
+ }
+ /**
+ * метод, осуществляющий перебр элементов списка
+ * используется циклом foreach, или при прочих способах перебора списка
+ */
+ @Override
+ public Iterator iterator() {
+ return new GenericIterator(head);
+ }
+ /**
+ * Клонируем список, без использования метода клонирования
+ * по сути создаем новый список и копируем в него данные.
+ * @param source
+ * @return
+ */
+ public DoublyGenericList clone(){
+ DoublyGenericList target = new DoublyGenericList<>();
+ for (T t : this) {
+ target.addLast((T)t);
+ }
+ return target;
+ }
+
+ /**
+ * клонирование списка
+ * можно доработать, если клонировать node.data,
+ * в остальных случаях будут клонироваться ссылки на объекты исходного списка
+ * в таком варианте можно осуществить реверс списка, который будет ссылаться на те же объекты
+ */
+ // public DoublyGenericList clone(){
+ // try{
+ // return (DoublyGenericList)super.clone();//возвращает новый список со ссылка ми на старые объекты
+ // }catch (CloneNotSupportedException e){
+ // System.out.println("Ошибка: Клонирование не удалось...");
+ // System.out.println("DoublyGenericList clone() вернул ссылку на тот же объект.");
+ // return this;
+ // }
+ // }
+
+ /**
+ * добавляем value к каждому значению в списке
+ * работает с integer или string
+ * @param value
+ */
+ public void increase(T value){
+ Node buf = head;
+ if (buf.data instanceof Number){
+ Integer midl = buf.toInteger() + (Integer)value;
+ buf.data = (T)midl;
+ while (buf.forvard != null){
+ midl = buf.forvard.toInteger() + (Integer)value;
+ buf.forvard.data = (T)midl;
+ buf = buf.forvard;
+ }
+ }
+ if (buf.data instanceof String){
+ String midl = buf.toString() + (String)value;
+ buf.data = (T)midl;
+ while (buf.forvard != null){
+ midl = buf.forvard.toString() + (String)value;
+ buf.forvard.data = (T)midl;
+ buf = buf.forvard;
+ }
+ }
+ }
+ /**
+ * Агрегирование элементов списка
+ * метод возвращает сумму всех полей списка
+ * - для Integer полей
+ * - для String полей
+ * @param value
+ */
+ public T agregate() throws IllegalArgumentException{
+ /**
+ * обрабатываем значения Integer
+ */
+ Node next = head;
+ if (next.data instanceof Number){
+ Integer sum = next.toInteger();//возвращает Integer data
+ while (next.forvard != null){
+ sum = (sum + next.forvard.toInteger());
+ next = next.forvard;
+ }
+ return (T)sum;
+ }
+ /**
+ * обрабатываем значения String
+ */
+ if (next.data instanceof String){
+ String sum = next.toString();
+ while (next.forvard != null){
+ sum = sum + next.forvard.toString();
+ next = next.forvard;
+ }
+ return (T)sum;
+ }
+ throw new IllegalArgumentException("В список передан недопустимый объект, не предусмаривающий возможность проведения операции суммирования ");
+ }
+ /**
+ * Методы итератора списка
+ */
+ private static class GenericIterator implements Iterator{
+ Node next;
+ GenericIterator(Node next){
+ this.next = next;
+ }
+ @Override
+ public boolean hasNext() {
+ if(next!=null) return true;
+ return false;
+ }
+ @Override
+ public T next() {
+ T value = (T)next.data;
+ next = next.forvard;
+ return value;
+ }
+ }
+ /**
+ * Вложенный класс, описывает узел двусвязного списка
+ */
+ private static class Node {
+ T data;//данные ячейки списка
+ Node forvard;//следующая ячейка списка
+ Node backvard;//предыдущая ячейка списка
+
+ /**
+ * Возвращает данные узла типа Integer
+ * @return
+ */
+ public Integer toInteger(){
+ if (data instanceof Integer){
+ return (Integer)data;
+ }else{
+ throw new IllegalArgumentException("IllegalArgumentException: даные не относятся к типу Integer");
+ }
+ }
+ /**
+ * возвращает данные узла типа String
+ */
+ public String toString(){
+ if (data instanceof String){
+ return (String)data;
+ }else{
+ throw new IllegalArgumentException("IllegalArgumentException: даные не относятся к типу String");
+ }
+ }
+ }
+}
diff --git a/java/lessons/src/main/java/ru/molokoin/j120/lab01/task5/Runner.java b/java/lessons/src/main/java/ru/molokoin/j120/lab01/task5/Runner.java
new file mode 100644
index 0000000..d58a054
--- /dev/null
+++ b/java/lessons/src/main/java/ru/molokoin/j120/lab01/task5/Runner.java
@@ -0,0 +1,85 @@
+package ru.molokoin.j120.lab01.task5;
+
+import java.util.Arrays;
+
+public class Runner {
+ public static void main(String[] args) {
+ System.out.println("--------------------------------------");
+ System.out.println("--------------------------------------");
+ System.out.println("Доработка списка DoublyGenericList");
+ System.out.println("--------------------------------------");
+ System.out.println("--------------------------------------");
+
+ //исходные данные в массиве
+ Integer[] array = {9, 12, 24,38, 43, 51, 62, 79, 81, 99};
+ //создали новый список
+ DoublyGenericList listInteger = new DoublyGenericList();
+ //занесли данные массива в список
+ listInteger.arrayToHead(array);
+ //вывели данные списка в консоль
+ for (Integer integer : listInteger) {
+ System.out.println("integer : " + integer);
+ }
+ //выводим данные списка в обратном порядке
+ for (Integer integer : listInteger.reverce()) {
+ System.out.println("integer.reverce() : " + integer);
+ }
+ //клонируем список
+ System.out.println("клонируем список ...");
+ DoublyGenericList listIntegerClone = listInteger.clone();
+ listIntegerClone.addLast(700);
+ listIntegerClone.addLast(800);
+ listIntegerClone.addLast(900);
+ System.out.println("Добавили новые данные в клона ...");
+ System.out.println("listInteger:");
+ listInteger.printForvard();
+ System.out.println();
+ System.out.println("listIntegerClone:");
+ listIntegerClone.printForvard();
+
+ /**
+ * выполняем заданное действие с каждым элементом списка
+ * (добавим 500)
+ */
+ System.out.println("Добавляем по 500 к каждому элементу списка ...");
+ listInteger.increase(500);
+ System.out.println("listInteger + 500:");
+ listInteger.printForvard();
+ System.out.println("listIntegerClone:");
+ listIntegerClone.printForvard();
+ System.out.println("Изменение основного списка не отразилось на клоне!!!");
+
+ /**
+ * добавим данных к строковым значениям
+ */
+ System.out.println("--------------------------------------");
+ System.out.println("Добавление данных к строковому массиву ...");
+ //исходные данные в массиве
+ String[] arr = {"one", "two", "three", "four", "five"};
+ System.out.println(Arrays.toString(arr));
+ //создали новый список
+ DoublyGenericList listString = new DoublyGenericList();
+ //занесли данные массива в список
+ listString.arrayToHead(arr);
+ //получаем список, в обратном порядке
+ DoublyGenericList listStringReverce = listString.reverce();
+
+ //добавили smth в основной список
+ listString.increase(" + smth");
+ System.out.println("listString.increase(smth);");
+ listString.printForvard();
+
+ //добавили smth в перевернутый список
+ listStringReverce.increase(" + smth-else");
+ System.out.println("listStringReverce.increase(smth-else);");
+ listStringReverce.printForvard();
+ /**
+ * агрегирование (суммируем элементы списка)
+ */
+ System.out.println("Агрегированное значение sum(listString): " + listString.agregate());
+ System.out.println("Агрегированное значение sum(listString.reverce()): " + listString.reverce().agregate());
+ System.out.println("Агрегированное значение sum(listInteger): " + listInteger.agregate());
+
+
+ }
+}
diff --git a/java/lessons/src/main/java/ru/molokoin/j120/lab01/task5/task.md b/java/lessons/src/main/java/ru/molokoin/j120/lab01/task5/task.md
new file mode 100644
index 0000000..f2f635c
--- /dev/null
+++ b/java/lessons/src/main/java/ru/molokoin/j120/lab01/task5/task.md
@@ -0,0 +1,12 @@
+# 5. Generic двусвязного списка, его использование в «for-each»
+Доработайте класс двусвязного списка из соответствующей задачи 110-го курса, чтобы он поз-
+волял:
+* сохранять и извлекать значения заданного типа;
+* перебирать при помощи оператора «for-each»:
+ - всё содержимое списка;
+ - всё содержимое списка в обратном порядке от последнего элемента к первому;
+* выполнять заданное действие для каждого значения списка в прямом/обратном порядке (два метода);
+* агрегировать значения (см. выше в задаче 2) в прямом/обратном порядке (два метода);
+* клонировать список (последующие операции с исходным списком или его копией не должны влиять друг на друга).
+
+**При реализации заданий «выполнять заданное действие» и «агрегировать значения» учитывайте правила PECS при использовании вспомогательных типов.**
\ No newline at end of file
diff --git a/java/lessons/src/main/java/ru/molokoin/package00/App.java b/java/lessons/src/main/java/ru/molokoin/package00/App.java
new file mode 100644
index 0000000..96c381d
--- /dev/null
+++ b/java/lessons/src/main/java/ru/molokoin/package00/App.java
@@ -0,0 +1,7 @@
+package ru.molokoin.package00;
+
+public class App {
+ public static void main(String[] args) {
+ System.out.println("qw");
+ }
+}
diff --git a/java/lessons/src/main/java/ru/molokoin/package01/App.java b/java/lessons/src/main/java/ru/molokoin/package01/App.java
new file mode 100644
index 0000000..00b8a8d
--- /dev/null
+++ b/java/lessons/src/main/java/ru/molokoin/package01/App.java
@@ -0,0 +1,7 @@
+package ru.molokoin.package01;
+
+public class App {
+ public static void main(String[] args) {
+ System.out.println("Thread.main");
+ }
+}
diff --git a/java/lessons/src/main/java/ru/molokoin/package01/Binary.java b/java/lessons/src/main/java/ru/molokoin/package01/Binary.java
new file mode 100644
index 0000000..de26b7a
--- /dev/null
+++ b/java/lessons/src/main/java/ru/molokoin/package01/Binary.java
@@ -0,0 +1,30 @@
+package ru.molokoin.package01;
+import java.util.Objects;
+
+public class Binary {
+ int size = 64/32;
+ int[] ints = new int[size];
+
+ public boolean getByIndex(int index){
+ int indexElement = index/32;
+ int element = ints[indexElement];
+ int indexBit = index%32;//остаток от деления
+ int mask = 1< IPart
+Number -> IPart
+
+interface IPhone{
+ void setCode(Code code)
+ void seNumber(Number number)
+ Code getCode()
+ Number getNumber()
+ Phone ofString(String string)
+ String toString(Phone phone)
+ int[] toIntArray(Phone phone)
+ boolean equals(Phone phone)
+}
+class Phone{
+ Code code
+ Number number
+ Phone()
+}
+
+Phone -> IPhone
+Phone *- Number
+Phone *- Code
+
+interface ICat{
+ void add(Phone phone)
+ void delete(Phone phone)
+ boolean isExist(Phone phone)
+}
+class Cat{}
+Cat -> ICat
+Phone -* Cat
+
+
+@enduml
\ No newline at end of file
diff --git a/java/lessons/target/classes/ru/molokoin/j120/lab01/task1/vers03/docs/regex.json b/java/lessons/target/classes/ru/molokoin/j120/lab01/task1/vers03/docs/regex.json
new file mode 100644
index 0000000..e69de29
diff --git a/java/lessons/target/classes/ru/molokoin/j120/lab01/task2/vers01/generics/Runner.class b/java/lessons/target/classes/ru/molokoin/j120/lab01/task2/vers01/generics/Runner.class
new file mode 100644
index 0000000..988d764
Binary files /dev/null and b/java/lessons/target/classes/ru/molokoin/j120/lab01/task2/vers01/generics/Runner.class differ
diff --git a/java/lessons/target/classes/ru/molokoin/j120/lab01/task2/vers01/generics/SimplyGenericList$Node.class b/java/lessons/target/classes/ru/molokoin/j120/lab01/task2/vers01/generics/SimplyGenericList$Node.class
new file mode 100644
index 0000000..7003aef
Binary files /dev/null and b/java/lessons/target/classes/ru/molokoin/j120/lab01/task2/vers01/generics/SimplyGenericList$Node.class differ
diff --git a/java/lessons/target/classes/ru/molokoin/j120/lab01/task2/vers01/generics/SimplyGenericList$SimplyGenericListIterator.class b/java/lessons/target/classes/ru/molokoin/j120/lab01/task2/vers01/generics/SimplyGenericList$SimplyGenericListIterator.class
new file mode 100644
index 0000000..800eac9
Binary files /dev/null and b/java/lessons/target/classes/ru/molokoin/j120/lab01/task2/vers01/generics/SimplyGenericList$SimplyGenericListIterator.class differ
diff --git a/java/lessons/target/classes/ru/molokoin/j120/lab01/task2/vers01/generics/SimplyGenericList.class b/java/lessons/target/classes/ru/molokoin/j120/lab01/task2/vers01/generics/SimplyGenericList.class
new file mode 100644
index 0000000..c90bb48
Binary files /dev/null and b/java/lessons/target/classes/ru/molokoin/j120/lab01/task2/vers01/generics/SimplyGenericList.class differ
diff --git a/java/lessons/target/classes/ru/molokoin/j120/lab01/task2/vers01/generics/UseMath.class b/java/lessons/target/classes/ru/molokoin/j120/lab01/task2/vers01/generics/UseMath.class
new file mode 100644
index 0000000..8510cc0
Binary files /dev/null and b/java/lessons/target/classes/ru/molokoin/j120/lab01/task2/vers01/generics/UseMath.class differ
diff --git a/java/lessons/target/classes/ru/molokoin/j120/lab01/task2/vers01/samples/LinkedList$LinkedIterator.class b/java/lessons/target/classes/ru/molokoin/j120/lab01/task2/vers01/samples/LinkedList$LinkedIterator.class
new file mode 100644
index 0000000..577634a
Binary files /dev/null and b/java/lessons/target/classes/ru/molokoin/j120/lab01/task2/vers01/samples/LinkedList$LinkedIterator.class differ
diff --git a/java/lessons/target/classes/ru/molokoin/j120/lab01/task2/vers01/samples/LinkedList$Node.class b/java/lessons/target/classes/ru/molokoin/j120/lab01/task2/vers01/samples/LinkedList$Node.class
new file mode 100644
index 0000000..bafe9ef
Binary files /dev/null and b/java/lessons/target/classes/ru/molokoin/j120/lab01/task2/vers01/samples/LinkedList$Node.class differ
diff --git a/java/lessons/target/classes/ru/molokoin/j120/lab01/task2/vers01/samples/LinkedList.class b/java/lessons/target/classes/ru/molokoin/j120/lab01/task2/vers01/samples/LinkedList.class
new file mode 100644
index 0000000..1c73030
Binary files /dev/null and b/java/lessons/target/classes/ru/molokoin/j120/lab01/task2/vers01/samples/LinkedList.class differ
diff --git a/java/lessons/target/classes/ru/molokoin/j120/lab01/task2/vers01/samples/MainClass.class b/java/lessons/target/classes/ru/molokoin/j120/lab01/task2/vers01/samples/MainClass.class
new file mode 100644
index 0000000..7b0c647
Binary files /dev/null and b/java/lessons/target/classes/ru/molokoin/j120/lab01/task2/vers01/samples/MainClass.class differ
diff --git a/java/lessons/target/classes/ru/molokoin/j120/lab01/task3/person/Degree$1.class b/java/lessons/target/classes/ru/molokoin/j120/lab01/task3/person/Degree$1.class
new file mode 100644
index 0000000..5c00ab9
Binary files /dev/null and b/java/lessons/target/classes/ru/molokoin/j120/lab01/task3/person/Degree$1.class differ
diff --git a/java/lessons/target/classes/ru/molokoin/j120/lab01/task3/person/Degree$2.class b/java/lessons/target/classes/ru/molokoin/j120/lab01/task3/person/Degree$2.class
new file mode 100644
index 0000000..4b90ba7
Binary files /dev/null and b/java/lessons/target/classes/ru/molokoin/j120/lab01/task3/person/Degree$2.class differ
diff --git a/java/lessons/target/classes/ru/molokoin/j120/lab01/task3/person/Degree.class b/java/lessons/target/classes/ru/molokoin/j120/lab01/task3/person/Degree.class
new file mode 100644
index 0000000..6685efd
Binary files /dev/null and b/java/lessons/target/classes/ru/molokoin/j120/lab01/task3/person/Degree.class differ
diff --git a/java/lessons/target/classes/ru/molokoin/j120/lab01/task3/person/Gender$1.class b/java/lessons/target/classes/ru/molokoin/j120/lab01/task3/person/Gender$1.class
new file mode 100644
index 0000000..f3147cc
Binary files /dev/null and b/java/lessons/target/classes/ru/molokoin/j120/lab01/task3/person/Gender$1.class differ
diff --git a/java/lessons/target/classes/ru/molokoin/j120/lab01/task3/person/Gender$2.class b/java/lessons/target/classes/ru/molokoin/j120/lab01/task3/person/Gender$2.class
new file mode 100644
index 0000000..62c4c54
Binary files /dev/null and b/java/lessons/target/classes/ru/molokoin/j120/lab01/task3/person/Gender$2.class differ
diff --git a/java/lessons/target/classes/ru/molokoin/j120/lab01/task3/person/Gender$3.class b/java/lessons/target/classes/ru/molokoin/j120/lab01/task3/person/Gender$3.class
new file mode 100644
index 0000000..68a2ca9
Binary files /dev/null and b/java/lessons/target/classes/ru/molokoin/j120/lab01/task3/person/Gender$3.class differ
diff --git a/java/lessons/target/classes/ru/molokoin/j120/lab01/task3/person/Gender.class b/java/lessons/target/classes/ru/molokoin/j120/lab01/task3/person/Gender.class
new file mode 100644
index 0000000..c27ee51
Binary files /dev/null and b/java/lessons/target/classes/ru/molokoin/j120/lab01/task3/person/Gender.class differ
diff --git a/java/lessons/target/classes/ru/molokoin/j120/lab01/task3/person/Person.class b/java/lessons/target/classes/ru/molokoin/j120/lab01/task3/person/Person.class
new file mode 100644
index 0000000..27d087d
Binary files /dev/null and b/java/lessons/target/classes/ru/molokoin/j120/lab01/task3/person/Person.class differ
diff --git a/java/lessons/target/classes/ru/molokoin/j120/lab01/task3/person/Personable.class b/java/lessons/target/classes/ru/molokoin/j120/lab01/task3/person/Personable.class
new file mode 100644
index 0000000..7a5c2d1
Binary files /dev/null and b/java/lessons/target/classes/ru/molokoin/j120/lab01/task3/person/Personable.class differ
diff --git a/java/lessons/target/classes/ru/molokoin/j120/lab01/task3/person/Role$1.class b/java/lessons/target/classes/ru/molokoin/j120/lab01/task3/person/Role$1.class
new file mode 100644
index 0000000..0d2df54
Binary files /dev/null and b/java/lessons/target/classes/ru/molokoin/j120/lab01/task3/person/Role$1.class differ
diff --git a/java/lessons/target/classes/ru/molokoin/j120/lab01/task3/person/Role$2.class b/java/lessons/target/classes/ru/molokoin/j120/lab01/task3/person/Role$2.class
new file mode 100644
index 0000000..d4eb487
Binary files /dev/null and b/java/lessons/target/classes/ru/molokoin/j120/lab01/task3/person/Role$2.class differ
diff --git a/java/lessons/target/classes/ru/molokoin/j120/lab01/task3/person/Role$3.class b/java/lessons/target/classes/ru/molokoin/j120/lab01/task3/person/Role$3.class
new file mode 100644
index 0000000..e5394f3
Binary files /dev/null and b/java/lessons/target/classes/ru/molokoin/j120/lab01/task3/person/Role$3.class differ
diff --git a/java/lessons/target/classes/ru/molokoin/j120/lab01/task3/person/Role.class b/java/lessons/target/classes/ru/molokoin/j120/lab01/task3/person/Role.class
new file mode 100644
index 0000000..42ff449
Binary files /dev/null and b/java/lessons/target/classes/ru/molokoin/j120/lab01/task3/person/Role.class differ
diff --git a/java/lessons/target/classes/ru/molokoin/j120/lab01/task3/person/Stage$1.class b/java/lessons/target/classes/ru/molokoin/j120/lab01/task3/person/Stage$1.class
new file mode 100644
index 0000000..8eaf331
Binary files /dev/null and b/java/lessons/target/classes/ru/molokoin/j120/lab01/task3/person/Stage$1.class differ
diff --git a/java/lessons/target/classes/ru/molokoin/j120/lab01/task3/person/Stage$2.class b/java/lessons/target/classes/ru/molokoin/j120/lab01/task3/person/Stage$2.class
new file mode 100644
index 0000000..2202a49
Binary files /dev/null and b/java/lessons/target/classes/ru/molokoin/j120/lab01/task3/person/Stage$2.class differ
diff --git a/java/lessons/target/classes/ru/molokoin/j120/lab01/task3/person/Stage.class b/java/lessons/target/classes/ru/molokoin/j120/lab01/task3/person/Stage.class
new file mode 100644
index 0000000..0e6a873
Binary files /dev/null and b/java/lessons/target/classes/ru/molokoin/j120/lab01/task3/person/Stage.class differ
diff --git a/java/lessons/target/classes/ru/molokoin/j120/lab01/task4/RegularStudent.class b/java/lessons/target/classes/ru/molokoin/j120/lab01/task4/RegularStudent.class
new file mode 100644
index 0000000..f229690
Binary files /dev/null and b/java/lessons/target/classes/ru/molokoin/j120/lab01/task4/RegularStudent.class differ
diff --git a/java/lessons/target/classes/ru/molokoin/j120/lab01/task4/task.md b/java/lessons/target/classes/ru/molokoin/j120/lab01/task4/task.md
new file mode 100644
index 0000000..f7903fb
--- /dev/null
+++ b/java/lessons/target/classes/ru/molokoin/j120/lab01/task4/task.md
@@ -0,0 +1,8 @@
+# 4. Заполнение параметризованной коллекции.
+**Реализуйте в классе RegularStudent из соответствующей задачи 110-го курса статический метод:**
+* заполняющий заданную коллекцию типа Collection данными о некоторых студентах (например: данными, приведёнными в примере в задаче 110-го курса).
+* Сделайте так, чтобы метод мог корректно использоваться как с коллекциями типа Сollection,
+* так и с коллекциями, параметризованными другими типами.
+* Подумайте, какими типами может быть параметризована такая коллекция.
+* Проиллюстрируйте использование метода.
+* **Доработайте класс односвязного списка, чтобы методы «выполнять заданное действие» и «агрегировать значения» соответствовали правилам PECS при использовании вспомогательных типов.**
\ No newline at end of file
diff --git a/java/lessons/target/classes/ru/molokoin/j120/lab01/task5/DoublyGenericList$GenericIterator.class b/java/lessons/target/classes/ru/molokoin/j120/lab01/task5/DoublyGenericList$GenericIterator.class
new file mode 100644
index 0000000..3e6ea51
Binary files /dev/null and b/java/lessons/target/classes/ru/molokoin/j120/lab01/task5/DoublyGenericList$GenericIterator.class differ
diff --git a/java/lessons/target/classes/ru/molokoin/j120/lab01/task5/DoublyGenericList$Node.class b/java/lessons/target/classes/ru/molokoin/j120/lab01/task5/DoublyGenericList$Node.class
new file mode 100644
index 0000000..1aa6798
Binary files /dev/null and b/java/lessons/target/classes/ru/molokoin/j120/lab01/task5/DoublyGenericList$Node.class differ
diff --git a/java/lessons/target/classes/ru/molokoin/j120/lab01/task5/DoublyGenericList.class b/java/lessons/target/classes/ru/molokoin/j120/lab01/task5/DoublyGenericList.class
new file mode 100644
index 0000000..6430bfe
Binary files /dev/null and b/java/lessons/target/classes/ru/molokoin/j120/lab01/task5/DoublyGenericList.class differ
diff --git a/java/lessons/target/classes/ru/molokoin/j120/lab01/task5/Runner.class b/java/lessons/target/classes/ru/molokoin/j120/lab01/task5/Runner.class
new file mode 100644
index 0000000..eeec933
Binary files /dev/null and b/java/lessons/target/classes/ru/molokoin/j120/lab01/task5/Runner.class differ
diff --git a/java/lessons/target/classes/ru/molokoin/j120/lab01/task5/task.md b/java/lessons/target/classes/ru/molokoin/j120/lab01/task5/task.md
new file mode 100644
index 0000000..f2f635c
--- /dev/null
+++ b/java/lessons/target/classes/ru/molokoin/j120/lab01/task5/task.md
@@ -0,0 +1,12 @@
+# 5. Generic двусвязного списка, его использование в «for-each»
+Доработайте класс двусвязного списка из соответствующей задачи 110-го курса, чтобы он поз-
+волял:
+* сохранять и извлекать значения заданного типа;
+* перебирать при помощи оператора «for-each»:
+ - всё содержимое списка;
+ - всё содержимое списка в обратном порядке от последнего элемента к первому;
+* выполнять заданное действие для каждого значения списка в прямом/обратном порядке (два метода);
+* агрегировать значения (см. выше в задаче 2) в прямом/обратном порядке (два метода);
+* клонировать список (последующие операции с исходным списком или его копией не должны влиять друг на друга).
+
+**При реализации заданий «выполнять заданное действие» и «агрегировать значения» учитывайте правила PECS при использовании вспомогательных типов.**
\ No newline at end of file
diff --git a/java/lessons/target/classes/ru/molokoin/package00/App.class b/java/lessons/target/classes/ru/molokoin/package00/App.class
new file mode 100644
index 0000000..0277bcd
Binary files /dev/null and b/java/lessons/target/classes/ru/molokoin/package00/App.class differ
diff --git a/java/lessons/target/classes/ru/molokoin/package01/App.class b/java/lessons/target/classes/ru/molokoin/package01/App.class
new file mode 100644
index 0000000..547489d
Binary files /dev/null and b/java/lessons/target/classes/ru/molokoin/package01/App.class differ
diff --git a/java/lessons/target/classes/ru/molokoin/package01/Binary.class b/java/lessons/target/classes/ru/molokoin/package01/Binary.class
new file mode 100644
index 0000000..3d20ecc
Binary files /dev/null and b/java/lessons/target/classes/ru/molokoin/package01/Binary.class differ
diff --git a/java/lessons/target/classes/ru/molokoin/package02/App.class b/java/lessons/target/classes/ru/molokoin/package02/App.class
new file mode 100644
index 0000000..59f04ad
Binary files /dev/null and b/java/lessons/target/classes/ru/molokoin/package02/App.class differ
diff --git a/java/lessons/target/classes/ru/molokoin/package03/Runner.class b/java/lessons/target/classes/ru/molokoin/package03/Runner.class
new file mode 100644
index 0000000..ec53fd2
Binary files /dev/null and b/java/lessons/target/classes/ru/molokoin/package03/Runner.class differ
diff --git a/java/lessons/target/classes/ru/molokoin/package03/theme.md b/java/lessons/target/classes/ru/molokoin/package03/theme.md
new file mode 100644
index 0000000..0b6ea55
--- /dev/null
+++ b/java/lessons/target/classes/ru/molokoin/package03/theme.md
@@ -0,0 +1 @@
+# mysql работа с базами данных
\ No newline at end of file