diff --git a/resource/files/lesson32_files_1/task1/carCatalog.txt b/resource/files/lesson32_files_1/task1/carCatalog.txt new file mode 100644 index 000000000..79dedc126 --- /dev/null +++ b/resource/files/lesson32_files_1/task1/carCatalog.txt @@ -0,0 +1,10 @@ +RR-111-RR;2015;yellow +RR-222-RR;2016;yellow +RR-333-RR;2017;yellow +RR-444-RR;2018;yellow +RR-555-RR;2018;yellow +RR-666-RR;2018;yellow +RR-777-RR;2018;yellow +RR-888-RR;2018;yellow +RR-999-RR;2018;yellow +RR-000-RR;2018;yellow diff --git a/resource/files/lesson32_files_1/task2/carCatalog.txt b/resource/files/lesson32_files_1/task2/carCatalog.txt new file mode 100644 index 000000000..79dedc126 --- /dev/null +++ b/resource/files/lesson32_files_1/task2/carCatalog.txt @@ -0,0 +1,10 @@ +RR-111-RR;2015;yellow +RR-222-RR;2016;yellow +RR-333-RR;2017;yellow +RR-444-RR;2018;yellow +RR-555-RR;2018;yellow +RR-666-RR;2018;yellow +RR-777-RR;2018;yellow +RR-888-RR;2018;yellow +RR-999-RR;2018;yellow +RR-000-RR;2018;yellow diff --git a/src/com/walking/lesson14_polymorphism/task1/Main.java b/src/com/walking/lesson14_polymorphism/task1/Main.java index 41022d7f2..887092c5c 100644 --- a/src/com/walking/lesson14_polymorphism/task1/Main.java +++ b/src/com/walking/lesson14_polymorphism/task1/Main.java @@ -1,5 +1,11 @@ package com.walking.lesson14_polymorphism.task1; +import com.walking.lesson14_polymorphism.task1.model.RegularFigure; +import com.walking.lesson14_polymorphism.task1.model.Square; +import com.walking.lesson14_polymorphism.task1.model.Triangle; + +import java.util.Scanner; + /** * Реализуйте класс «Правильная фигура». * Для него создайте классы-наследники «Треугольник» и «Квадрат». @@ -10,7 +16,41 @@ *

* Обратите внимание, символ '\' в Java необходимо экранировать: '\\'. */ + public class Main { + public static final Scanner SCANNER = new Scanner(System.in); + public static final String MENU = """ + 1. Triangle + 2. Square + + Make your choice:"""; + public static void main(String[] args) { + int figureType = requireInt(MENU); + + int length = requireInt("Enter a length: "); + + System.out.println(createFigure(figureType, length)); + } + + private static String createFigure(int figureType, int length) { + RegularFigure figure; + + switch (figureType) { + case 1: + figure = new Triangle(length); + break; + case 2: + figure = new Square(length); + break; + default: + figure = new RegularFigure(length); + } + return figure.getFigure(); + } + + public static int requireInt(String message) { + System.out.print(message); + return SCANNER.nextInt(); } } diff --git a/src/com/walking/lesson14_polymorphism/task1/model/RegularFigure.java b/src/com/walking/lesson14_polymorphism/task1/model/RegularFigure.java new file mode 100644 index 000000000..b1decfefa --- /dev/null +++ b/src/com/walking/lesson14_polymorphism/task1/model/RegularFigure.java @@ -0,0 +1,17 @@ +package com.walking.lesson14_polymorphism.task1.model; + +public class RegularFigure { + public static final String EMPTY_UNIT = " "; + public static final String NEW_LINE_UNIT = "\n"; + + public final int length; + + public RegularFigure(int length) { + this.length = length; + } + + public String getFigure() { + String figure = EMPTY_UNIT + NEW_LINE_UNIT; + return figure; + } +} diff --git a/src/com/walking/lesson14_polymorphism/task1/model/Square.java b/src/com/walking/lesson14_polymorphism/task1/model/Square.java new file mode 100644 index 000000000..3137d5254 --- /dev/null +++ b/src/com/walking/lesson14_polymorphism/task1/model/Square.java @@ -0,0 +1,43 @@ +package com.walking.lesson14_polymorphism.task1.model; + +public class Square extends RegularFigure { + public static final String VERTICAL_LINE_UNIT = "|"; + public static final String HORIZONTAL_UNIT = "---"; + + public Square(int length) { + super(length); + } + + @Override + public String getFigure() { + return createHorizontalLine() + createVerticalLines() + createHorizontalLine(); + + } + + protected String createHorizontalLine() { + String horizontalLine = EMPTY_UNIT; + for (int i = 0; i < length; i++) { + horizontalLine += HORIZONTAL_UNIT; + } + horizontalLine += EMPTY_UNIT + NEW_LINE_UNIT; + return horizontalLine; + } + + protected String createVerticalLines() { + String verticalLineUnit = createVerticalLineUnit(); + String verticalLines = ""; + for (int i = 0; i < length; i++) { + verticalLines += verticalLineUnit; + } + return verticalLines; + } + + private String createVerticalLineUnit() { + String verticalLineUnit = VERTICAL_LINE_UNIT; + for (int i = 0; i < length * 3; i++) { + verticalLineUnit += EMPTY_UNIT; + } + verticalLineUnit += VERTICAL_LINE_UNIT + NEW_LINE_UNIT; + return verticalLineUnit; + } +} diff --git a/src/com/walking/lesson14_polymorphism/task1/model/Triangle.java b/src/com/walking/lesson14_polymorphism/task1/model/Triangle.java new file mode 100644 index 000000000..8b492bc02 --- /dev/null +++ b/src/com/walking/lesson14_polymorphism/task1/model/Triangle.java @@ -0,0 +1,50 @@ +package com.walking.lesson14_polymorphism.task1.model; + +public class Triangle extends RegularFigure { + public static final String LEFT_SIDE_UNIT = "/"; + public static final String RIGHT_SIDE_UNIT = "\\"; + public static final String HORIZONTAL_UNIT = "--"; + + public Triangle(int length) { + super(length); + } + + @Override + public String getFigure() { + return createVerticalLines() + createHorizontalLine(); + } + + protected String createHorizontalLine() { + String horizontalLine = EMPTY_UNIT; + for (int i = 0; i < length; i++) { + horizontalLine += HORIZONTAL_UNIT; + } + return horizontalLine + NEW_LINE_UNIT; + } + + protected String createVerticalLines() { + String verticalLines = ""; + return createVerticalLines(length, length, verticalLines); + } + + private String createVerticalLines(int width, int height, String verticalLines) { + for (int l = 0; l < height; l++) { + verticalLines += createVerticalLineUnit(width--, l); + } + return verticalLines; + } + + private String createVerticalLineUnit(int width, int height) { + String verticalLineUnit = ""; + for (int before = width; before > 0; before--) { + verticalLineUnit += EMPTY_UNIT; + } + verticalLineUnit += LEFT_SIDE_UNIT; + for (int after = height * 2; after > 0; after--) { + verticalLineUnit += EMPTY_UNIT; + } + verticalLineUnit += RIGHT_SIDE_UNIT + NEW_LINE_UNIT; + + return verticalLineUnit; + } +} diff --git a/src/com/walking/lesson14_polymorphism/task2/Main.java b/src/com/walking/lesson14_polymorphism/task2/Main.java index f5b029941..e1daec34b 100644 --- a/src/com/walking/lesson14_polymorphism/task2/Main.java +++ b/src/com/walking/lesson14_polymorphism/task2/Main.java @@ -1,5 +1,10 @@ package com.walking.lesson14_polymorphism.task2; +import com.walking.lesson14_polymorphism.task2.model.Animal; +import com.walking.lesson14_polymorphism.task2.model.Cat; +import com.walking.lesson14_polymorphism.task2.model.Cow; +import com.walking.lesson14_polymorphism.task2.model.Dog; + /** * Используя новые знания, упростите реализацию задачи 2 из предыдущего урока: * ... @@ -8,7 +13,17 @@ *

* Использовать отдельное поле для хранения выводимой строки — недопустимо:) */ + public class Main { public static void main(String[] args) { + Animal[] animals = new Animal[]{new Cat(), new Cow(), new Dog()}; + + soundAll(animals); + } + + private static void soundAll(Animal[] animals) { + for (Animal x : animals) { + x.sound(); + } } } diff --git a/src/com/walking/lesson14_polymorphism/task2/model/Animal.java b/src/com/walking/lesson14_polymorphism/task2/model/Animal.java new file mode 100644 index 000000000..46f2041e2 --- /dev/null +++ b/src/com/walking/lesson14_polymorphism/task2/model/Animal.java @@ -0,0 +1,8 @@ +package com.walking.lesson14_polymorphism.task2.model; + +public class Animal { + + public void sound() { + System.out.println("Unknown animal"); + } +} diff --git a/src/com/walking/lesson14_polymorphism/task2/model/Cat.java b/src/com/walking/lesson14_polymorphism/task2/model/Cat.java new file mode 100644 index 000000000..7e5efe03d --- /dev/null +++ b/src/com/walking/lesson14_polymorphism/task2/model/Cat.java @@ -0,0 +1,9 @@ +package com.walking.lesson14_polymorphism.task2.model; + +public class Cat extends Animal { + + @Override + public void sound() { + System.out.println("meow"); + } +} diff --git a/src/com/walking/lesson14_polymorphism/task2/model/Cow.java b/src/com/walking/lesson14_polymorphism/task2/model/Cow.java new file mode 100644 index 000000000..933e9777c --- /dev/null +++ b/src/com/walking/lesson14_polymorphism/task2/model/Cow.java @@ -0,0 +1,9 @@ +package com.walking.lesson14_polymorphism.task2.model; + +public class Cow extends Animal { + + @Override + public void sound() { + System.out.println("moo"); + } +} diff --git a/src/com/walking/lesson14_polymorphism/task2/model/Dog.java b/src/com/walking/lesson14_polymorphism/task2/model/Dog.java new file mode 100644 index 000000000..5f4539bb4 --- /dev/null +++ b/src/com/walking/lesson14_polymorphism/task2/model/Dog.java @@ -0,0 +1,9 @@ +package com.walking.lesson14_polymorphism.task2.model; + +public class Dog extends Animal { + + @Override + public void sound() { + System.out.println("woof"); + } +} diff --git a/src/com/walking/lesson16_abstract_class_interface/task1_abstract_class/Main.java b/src/com/walking/lesson16_abstract_class_interface/task1_abstract_class/Main.java index 94f5a30f7..63e905d60 100644 --- a/src/com/walking/lesson16_abstract_class_interface/task1_abstract_class/Main.java +++ b/src/com/walking/lesson16_abstract_class_interface/task1_abstract_class/Main.java @@ -1,5 +1,11 @@ package com.walking.lesson16_abstract_class_interface.task1_abstract_class; +import com.walking.lesson16_abstract_class_interface.task1_abstract_class.model.EquiliteralShape; +import com.walking.lesson16_abstract_class_interface.task1_abstract_class.model.EquiliteralTriangle; +import com.walking.lesson16_abstract_class_interface.task1_abstract_class.model.Square; + +import java.util.Scanner; + /** * Реализуйте задачу * ... @@ -7,5 +13,38 @@ */ public class Main { public static void main(String[] args) { + Scanner scanner = new Scanner(System.in); + + System.out.print("Enter shape's length: "); + int length = scanner.nextInt(); + + System.out.print("Enter shape's type:\n 1: Square\n 2: Triangle\n"); + int shapeType = scanner.nextInt(); + + scanner.close(); + + if (length < 1 || (shapeType != 1 && shapeType != 2)) { + System.out.println("Incorrect input"); + return; + } + + String shapeString = createShapeString(length, shapeType); + System.out.println(shapeString); + } + + private static String createShapeString(int length, int type) { + EquiliteralShape shape; + + switch (type) { + case 1: + shape = new Square(length); + break; + case 2: + shape = new EquiliteralTriangle(length); + break; + default: + return "Unknown shape"; + } + return shape.createShapeString(); } } diff --git a/src/com/walking/lesson16_abstract_class_interface/task1_abstract_class/model/EquiliteralShape.java b/src/com/walking/lesson16_abstract_class_interface/task1_abstract_class/model/EquiliteralShape.java new file mode 100644 index 000000000..b31ba599d --- /dev/null +++ b/src/com/walking/lesson16_abstract_class_interface/task1_abstract_class/model/EquiliteralShape.java @@ -0,0 +1,19 @@ +package com.walking.lesson16_abstract_class_interface.task1_abstract_class.model; + +public abstract class EquiliteralShape { + public static final String EMPTY_ELEMENT = " "; + public static final String EMPTY_STRING = ""; + public static final char NEW_LINE_SYMBOL = '\n'; + + protected final int length; + + public EquiliteralShape(int length) { + this.length = length; + } + + public int getLength() { + return length; + } + + public abstract String createShapeString(); +} diff --git a/src/com/walking/lesson16_abstract_class_interface/task1_abstract_class/model/EquiliteralTriangle.java b/src/com/walking/lesson16_abstract_class_interface/task1_abstract_class/model/EquiliteralTriangle.java new file mode 100644 index 000000000..898df0485 --- /dev/null +++ b/src/com/walking/lesson16_abstract_class_interface/task1_abstract_class/model/EquiliteralTriangle.java @@ -0,0 +1,35 @@ +package com.walking.lesson16_abstract_class_interface.task1_abstract_class.model; + +public class EquiliteralTriangle extends EquiliteralShape { + public static final String TRIANGLE_HORIZONTAL_SIDE_ELEMENT = "--"; + public static final String TRIANGLE_LEFT_SIDE_ELEMENT = "/"; + public static final String TRIANGLE_RIGHT_SIDE_ELEMENT = "\\"; + + public EquiliteralTriangle(int length) { + super(length); + } + + @Override + public String createShapeString() { + String triangle = EMPTY_STRING; + + for (int i = 0; i < length; i++) { + for (int j = 0; j < length - i; j++) { + triangle += EMPTY_ELEMENT; + } + triangle += TRIANGLE_LEFT_SIDE_ELEMENT; + + for (int j = 0; j < i * 2; j++) { + triangle += EMPTY_ELEMENT; + } + triangle += TRIANGLE_RIGHT_SIDE_ELEMENT + NEW_LINE_SYMBOL; + } + triangle += EMPTY_ELEMENT; + + for (int i = 0; i < length; i++) { + triangle += TRIANGLE_HORIZONTAL_SIDE_ELEMENT; + } + + return triangle; + } +} diff --git a/src/com/walking/lesson16_abstract_class_interface/task1_abstract_class/model/Square.java b/src/com/walking/lesson16_abstract_class_interface/task1_abstract_class/model/Square.java new file mode 100644 index 000000000..8db44feb4 --- /dev/null +++ b/src/com/walking/lesson16_abstract_class_interface/task1_abstract_class/model/Square.java @@ -0,0 +1,54 @@ +package com.walking.lesson16_abstract_class_interface.task1_abstract_class.model; + +public class Square extends EquiliteralShape { + public static final String RECTANGLE_HORIZONTAL_ELEMENT = "-"; + public static final String RECTANGLE_VERTICAL_ELEMENT= "-"; + + public Square(int length) { + super(length); + } + + @Override + public String createShapeString() { + String horizontalLine = createHorizontalLine(); + String verticalLines = createVerticalLines(); + + return horizontalLine + verticalLines + horizontalLine; + } + + private String createHorizontalLine() { + String horizontalLine = EMPTY_ELEMENT; + + for (int i = 0; i < length; i++) { + horizontalLine += RECTANGLE_HORIZONTAL_ELEMENT; + } + + horizontalLine += EMPTY_ELEMENT + NEW_LINE_SYMBOL; + + return horizontalLine; + } + + private String createVerticalLines() { + String verticalLinesUnit = getVerticalLinesUnit(); + + String verticalLines = EMPTY_STRING; + + for (int i = 0; i < length; i++) { + verticalLines += verticalLinesUnit; + } + + return verticalLines; + } + + private String getVerticalLinesUnit() { + String verticalLinesUnit = RECTANGLE_VERTICAL_ELEMENT; + + for (int i = 0; i < length; i++) { + verticalLinesUnit += EMPTY_ELEMENT; + } + + verticalLinesUnit += RECTANGLE_VERTICAL_ELEMENT + NEW_LINE_SYMBOL; + + return verticalLinesUnit; + } +} diff --git a/src/com/walking/lesson16_abstract_class_interface/task1_interface/Main.java b/src/com/walking/lesson16_abstract_class_interface/task1_interface/Main.java index 75935142a..1bb64fbe9 100644 --- a/src/com/walking/lesson16_abstract_class_interface/task1_interface/Main.java +++ b/src/com/walking/lesson16_abstract_class_interface/task1_interface/Main.java @@ -1,5 +1,10 @@ package com.walking.lesson16_abstract_class_interface.task1_interface; +import com.walking.lesson16_abstract_class_interface.task1_interface.model.EquilateralShape; +import com.walking.lesson16_abstract_class_interface.task1_interface.model.EquilateralTriangle; +import com.walking.lesson16_abstract_class_interface.task1_interface.model.Square; + +import java.util.Scanner; /** * Реализуйте задачу @@ -8,5 +13,40 @@ */ public class Main { public static void main(String[] args) { + Scanner scanner = new Scanner(System.in); + + System.out.print("Enter shape's length: "); + int length = scanner.nextInt(); + + System.out.print("Enter shape's type:\n 1: Square\n 2: Triangle\n"); + int shapeType = scanner.nextInt(); + + scanner.close(); + + if (length < 1 || (shapeType != 1 && shapeType != 2)) { + System.out.println("Incorrect input"); + return; + } + + String shapeString = createShapeString(length, shapeType); + System.out.println(shapeString); + + } + + private static String createShapeString(int length, int type) { + EquilateralShape shape; + + switch (type) { + case 1: + shape = new Square(length); + break; + case 2: + shape = new EquilateralTriangle(length); + break; + default: + return "Unknown shape"; + } + + return shape.createShapeString(); } } diff --git a/src/com/walking/lesson16_abstract_class_interface/task1_interface/model/EquilateralShape.java b/src/com/walking/lesson16_abstract_class_interface/task1_interface/model/EquilateralShape.java new file mode 100644 index 000000000..01ef262dc --- /dev/null +++ b/src/com/walking/lesson16_abstract_class_interface/task1_interface/model/EquilateralShape.java @@ -0,0 +1,11 @@ +package com.walking.lesson16_abstract_class_interface.task1_interface.model; + +public interface EquilateralShape { + String EMPTY_ELEMENT = " "; + String EMPTY_STRING = ""; + char NEW_LINE_SYMBOL = '\n'; + + String createShapeString(); + + int getLength(); +} diff --git a/src/com/walking/lesson16_abstract_class_interface/task1_interface/model/EquilateralTriangle.java b/src/com/walking/lesson16_abstract_class_interface/task1_interface/model/EquilateralTriangle.java new file mode 100644 index 000000000..4c1a08cb2 --- /dev/null +++ b/src/com/walking/lesson16_abstract_class_interface/task1_interface/model/EquilateralTriangle.java @@ -0,0 +1,42 @@ +package com.walking.lesson16_abstract_class_interface.task1_interface.model; + +public class EquilateralTriangle implements EquilateralShape { + public static final String TRIANGLE_HORIZONTAL_SIDE_ELEMENT = "--"; + public static final String TRIANGLE_LEFT_SIDE_ELEMENT = "/"; + public static final String TRIANGLE_RIGHT_SIDE_ELEMENT = "\\"; + + private final int length; + + public EquilateralTriangle(int length) { + this.length = length; + } + + @Override + public String createShapeString() { + String triangle = EMPTY_STRING; + + for (int i = 0; i < length; i++) { + for (int j = 0; j < length - i; j++) { + triangle += EMPTY_ELEMENT; + } + triangle += TRIANGLE_LEFT_SIDE_ELEMENT; + + for (int j = 0; j < i * 2; j++) { + triangle += EMPTY_ELEMENT; + } + triangle += TRIANGLE_RIGHT_SIDE_ELEMENT + NEW_LINE_SYMBOL; + } + triangle += EMPTY_ELEMENT; + + for (int i = 0; i < length; i++) { + triangle += TRIANGLE_HORIZONTAL_SIDE_ELEMENT; + } + + return triangle; + } + + @Override + public int getLength() { + return length; + } +} diff --git a/src/com/walking/lesson16_abstract_class_interface/task1_interface/model/Square.java b/src/com/walking/lesson16_abstract_class_interface/task1_interface/model/Square.java new file mode 100644 index 000000000..dea5855b0 --- /dev/null +++ b/src/com/walking/lesson16_abstract_class_interface/task1_interface/model/Square.java @@ -0,0 +1,61 @@ +package com.walking.lesson16_abstract_class_interface.task1_interface.model; + +public class Square implements EquilateralShape { + public static final String RECTANGLE_HORIZONTAL_ELEMENT = "-"; + public static final String RECTANGLE_VERTICAL_ELEMENT= "-"; + + private final int length; + + public Square(int length) { + this.length = length; + } + + @Override + public String createShapeString() { + String horizontalLine = createHorizontalLine(); + String verticalLines = createVerticalLines(); + + return horizontalLine + verticalLines + horizontalLine; + } + + @Override + public int getLength() { + return length; + } + + private String createHorizontalLine() { + String horizontalLine = EMPTY_ELEMENT; + + for (int i = 0; i < length; i++) { + horizontalLine += RECTANGLE_HORIZONTAL_ELEMENT; + } + + horizontalLine += EMPTY_ELEMENT + NEW_LINE_SYMBOL; + + return horizontalLine; + } + + private String createVerticalLines() { + String verticalLinesUnit = getVerticalLinesUnit(); + + String verticalLines = EMPTY_STRING; + + for (int i = 0; i < length; i++) { + verticalLines += verticalLinesUnit; + } + + return verticalLines; + } + + private String getVerticalLinesUnit() { + String verticalLinesUnit = RECTANGLE_VERTICAL_ELEMENT; + + for (int i = 0; i < length; i++) { + verticalLinesUnit += EMPTY_ELEMENT; + } + + verticalLinesUnit += RECTANGLE_VERTICAL_ELEMENT + NEW_LINE_SYMBOL; + + return verticalLinesUnit; + } +} diff --git a/src/com/walking/lesson16_abstract_class_interface/task2/Main.java b/src/com/walking/lesson16_abstract_class_interface/task2/Main.java index e79f80e2e..0cc90ab66 100644 --- a/src/com/walking/lesson16_abstract_class_interface/task2/Main.java +++ b/src/com/walking/lesson16_abstract_class_interface/task2/Main.java @@ -1,11 +1,45 @@ package com.walking.lesson16_abstract_class_interface.task2; +import com.walking.lesson16_abstract_class_interface.task2.printer.*; + +import java.util.Scanner; + /** * Реализуйте задачу * ... * с использованием интерфейсов. Каждая реализация должна возвращать свое сообщение. */ public class Main { + public static final Scanner scanner = new Scanner(System.in); + public static void main(String[] args) { + + String s = requireString("Enter String: "); + scanner.close(); + + createAnswer(s).getAnswer(); + } + + private static String requireString(String message) { + System.out.print(message); + return scanner.nextLine(); + } + + public static AnswerCreator createAnswer(String question) { + + switch (question) { + case "Hi": + return new Hi(); + case "How are you": + return new HowAreYou(); + case "Bye": + return new Bye(); + default: + return new UnknownAnswer(); + + } } } +// Не подсматривал - всё сам) +// Но возник вопрос% Мы должны переопределть все методы Интерфейса, +// кроме помеченных как static и default, верно? \ No newline at end of file diff --git a/src/com/walking/lesson16_abstract_class_interface/task2/printer/AnswerCreator.java b/src/com/walking/lesson16_abstract_class_interface/task2/printer/AnswerCreator.java new file mode 100644 index 000000000..fca4d3af8 --- /dev/null +++ b/src/com/walking/lesson16_abstract_class_interface/task2/printer/AnswerCreator.java @@ -0,0 +1,6 @@ +package com.walking.lesson16_abstract_class_interface.task2.printer; + +public interface AnswerCreator { + + void getAnswer(); +} diff --git a/src/com/walking/lesson16_abstract_class_interface/task2/printer/Bye.java b/src/com/walking/lesson16_abstract_class_interface/task2/printer/Bye.java new file mode 100644 index 000000000..72d300a87 --- /dev/null +++ b/src/com/walking/lesson16_abstract_class_interface/task2/printer/Bye.java @@ -0,0 +1,8 @@ +package com.walking.lesson16_abstract_class_interface.task2.printer; + +public class Bye implements AnswerCreator { + @Override + public void getAnswer() { + System.out.println("Good bye"); + } +} \ No newline at end of file diff --git a/src/com/walking/lesson16_abstract_class_interface/task2/printer/Hi.java b/src/com/walking/lesson16_abstract_class_interface/task2/printer/Hi.java new file mode 100644 index 000000000..f2764c0d3 --- /dev/null +++ b/src/com/walking/lesson16_abstract_class_interface/task2/printer/Hi.java @@ -0,0 +1,8 @@ +package com.walking.lesson16_abstract_class_interface.task2.printer; + +public class Hi implements AnswerCreator { + @Override + public void getAnswer() { + System.out.println("Hello"); + } +} \ No newline at end of file diff --git a/src/com/walking/lesson16_abstract_class_interface/task2/printer/HowAreYou.java b/src/com/walking/lesson16_abstract_class_interface/task2/printer/HowAreYou.java new file mode 100644 index 000000000..c1a0702a3 --- /dev/null +++ b/src/com/walking/lesson16_abstract_class_interface/task2/printer/HowAreYou.java @@ -0,0 +1,8 @@ +package com.walking.lesson16_abstract_class_interface.task2.printer; + +public class HowAreYou implements AnswerCreator { + @Override + public void getAnswer() { + System.out.println("How are you doing?"); + } +} \ No newline at end of file diff --git a/src/com/walking/lesson16_abstract_class_interface/task2/printer/UnknownAnswer.java b/src/com/walking/lesson16_abstract_class_interface/task2/printer/UnknownAnswer.java new file mode 100644 index 000000000..4af0dd819 --- /dev/null +++ b/src/com/walking/lesson16_abstract_class_interface/task2/printer/UnknownAnswer.java @@ -0,0 +1,8 @@ +package com.walking.lesson16_abstract_class_interface.task2.printer; + +public class UnknownAnswer implements AnswerCreator { + @Override + public void getAnswer() { + System.out.println("Unknown answer"); + } +} \ No newline at end of file diff --git a/src/com/walking/lesson16_abstract_class_interface/task3/Main.java b/src/com/walking/lesson16_abstract_class_interface/task3/Main.java index f66ab8489..b67555b90 100644 --- a/src/com/walking/lesson16_abstract_class_interface/task3/Main.java +++ b/src/com/walking/lesson16_abstract_class_interface/task3/Main.java @@ -1,6 +1,11 @@ package com.walking.lesson16_abstract_class_interface.task3; +import com.walking.lesson16_abstract_class_interface.task3.model.Animal; +import com.walking.lesson16_abstract_class_interface.task3.model.Cat; +import com.walking.lesson16_abstract_class_interface.task3.model.Cow; +import com.walking.lesson16_abstract_class_interface.task3.model.Dog; + /** * Реализуйте любую задачу из уроков о наследовании или полиморфизме с использованием новых знаний. * Выбирайте инструмент с умом. @@ -10,5 +15,14 @@ */ public class Main { public static void main(String[] args) { + Animal[] animals = new Animal[]{new Cow(), new Cat(), new Dog()}; + + soundAll(animals); + } + + private static void soundAll(Animal[] animals) { + for (Animal animal : animals) { + animal.sound(); + } } } diff --git a/src/com/walking/lesson16_abstract_class_interface/task3/model/Animal.java b/src/com/walking/lesson16_abstract_class_interface/task3/model/Animal.java new file mode 100644 index 000000000..7097f4d06 --- /dev/null +++ b/src/com/walking/lesson16_abstract_class_interface/task3/model/Animal.java @@ -0,0 +1,6 @@ +package com.walking.lesson16_abstract_class_interface.task3.model; + +public abstract class Animal { + + public abstract void sound(); +} diff --git a/src/com/walking/lesson16_abstract_class_interface/task3/model/Cat.java b/src/com/walking/lesson16_abstract_class_interface/task3/model/Cat.java new file mode 100644 index 000000000..0acf0bbbf --- /dev/null +++ b/src/com/walking/lesson16_abstract_class_interface/task3/model/Cat.java @@ -0,0 +1,8 @@ +package com.walking.lesson16_abstract_class_interface.task3.model; + +public class Cat extends Animal { + @Override + public void sound() { + System.out.println("meow"); + } +} diff --git a/src/com/walking/lesson16_abstract_class_interface/task3/model/Cow.java b/src/com/walking/lesson16_abstract_class_interface/task3/model/Cow.java new file mode 100644 index 000000000..6da237f8f --- /dev/null +++ b/src/com/walking/lesson16_abstract_class_interface/task3/model/Cow.java @@ -0,0 +1,8 @@ +package com.walking.lesson16_abstract_class_interface.task3.model; + +public class Cow extends Animal { + @Override + public void sound() { + System.out.println("moo"); + } +} diff --git a/src/com/walking/lesson16_abstract_class_interface/task3/model/Dog.java b/src/com/walking/lesson16_abstract_class_interface/task3/model/Dog.java new file mode 100644 index 000000000..d38e91d69 --- /dev/null +++ b/src/com/walking/lesson16_abstract_class_interface/task3/model/Dog.java @@ -0,0 +1,8 @@ +package com.walking.lesson16_abstract_class_interface.task3.model; + +public class Dog extends Animal { + @Override + public void sound() { + System.out.println("woof"); + } +} diff --git a/src/com/walking/lesson17_enum/task1/Main.java b/src/com/walking/lesson17_enum/task1/Main.java index 7fc684202..c96d7918d 100644 --- a/src/com/walking/lesson17_enum/task1/Main.java +++ b/src/com/walking/lesson17_enum/task1/Main.java @@ -1,5 +1,9 @@ package com.walking.lesson17_enum.task1; +import com.walking.lesson17_enum.task1.answer.Report; + +import java.util.Scanner; + /** * Реализуйте задачу * ... @@ -8,5 +12,13 @@ */ public class Main { public static void main(String[] args) { + Scanner scanner = new Scanner(System.in); + + System.out.print("Enter a question: "); + String question = scanner.nextLine(); + + scanner.close(); + + System.out.println(Report.toAnswer(question)); } } diff --git a/src/com/walking/lesson17_enum/task1/answer/Report.java b/src/com/walking/lesson17_enum/task1/answer/Report.java new file mode 100644 index 000000000..291f93b0b --- /dev/null +++ b/src/com/walking/lesson17_enum/task1/answer/Report.java @@ -0,0 +1,33 @@ +package com.walking.lesson17_enum.task1.answer; + +public enum Report { + HI("Hello", "Hi"), + HOW_ARE_YOU("How are you doing?", "How are you"), + BYE("Good bye", "Bye"), + UNKNOWN_GREETING("Unknown phrase", "some question"); + + private final String answer; + private final String message; + + Report(String answer, String message) { + this.answer = answer; + this.message = message; + } + + public String getAnswer() { + return answer; + } + + public String getMessage() { + return message; + } + + public static String toAnswer(String phrase) { + for (Report x : values()) { + if (phrase.equals(x.getMessage())) { + return x.getAnswer(); + } + } + return UNKNOWN_GREETING.getAnswer(); + } +} diff --git a/src/com/walking/lesson17_enum/task2/Main.java b/src/com/walking/lesson17_enum/task2/Main.java index 293ca15c9..6727caf25 100644 --- a/src/com/walking/lesson17_enum/task2/Main.java +++ b/src/com/walking/lesson17_enum/task2/Main.java @@ -1,5 +1,7 @@ package com.walking.lesson17_enum.task2; +import com.walking.lesson17_enum.task2.model.Animal; + /** * Реализуйте задачу * ... @@ -7,5 +9,14 @@ */ public class Main { public static void main(String[] args) { + Animal[] animals = Animal.values(); + + soundAll(animals); + } + + private static void soundAll(Animal[] animals) { + for (Animal animal : animals) { + animal.sound(); + } } } diff --git a/src/com/walking/lesson17_enum/task2/model/Animal.java b/src/com/walking/lesson17_enum/task2/model/Animal.java new file mode 100644 index 000000000..321dd7ac0 --- /dev/null +++ b/src/com/walking/lesson17_enum/task2/model/Animal.java @@ -0,0 +1,24 @@ +package com.walking.lesson17_enum.task2.model; + +public enum Animal { + CAT { + @Override + public void sound() { + System.out.println("meow"); + } + }, + DOG { + @Override + public void sound() { + System.out.println("woof"); + } + }, + COW { + @Override + public void sound() { + System.out.println("moo"); + } + }; + + public abstract void sound(); +} diff --git a/src/com/walking/lesson17_enum/task3/Main.java b/src/com/walking/lesson17_enum/task3/Main.java index fb541e003..7bd8b7134 100644 --- a/src/com/walking/lesson17_enum/task3/Main.java +++ b/src/com/walking/lesson17_enum/task3/Main.java @@ -1,5 +1,9 @@ package com.walking.lesson17_enum.task3; +import com.walking.lesson17_enum.task3.model.EquilateralShape; + +import java.util.Scanner; + /** * Реализуйте задачу * ... @@ -7,5 +11,29 @@ */ public class Main { public static void main(String[] args) { + Scanner scanner = new Scanner(System.in); + + System.out.print("Enter shape's type:\n 0: Triangle \n 1: Square\n "); + int shapeType = scanner.nextInt(); + + System.out.print("Enter shape's length: "); + int length = scanner.nextInt(); + + if ((shapeType != 0 && shapeType != 1)) { + System.out.println("Incorrect input"); + return; + } + + printShape(shapeType, length); + } + + private static void printShape(int type, int length) { + + for (EquilateralShape x : EquilateralShape.values()) { + if (type == x.ordinal()) { + System.out.println(x.createShapeString(length)); + } + + } } } diff --git a/src/com/walking/lesson17_enum/task3/model/EquilateralShape.java b/src/com/walking/lesson17_enum/task3/model/EquilateralShape.java new file mode 100644 index 000000000..d43fa2ef8 --- /dev/null +++ b/src/com/walking/lesson17_enum/task3/model/EquilateralShape.java @@ -0,0 +1,87 @@ +package com.walking.lesson17_enum.task3.model; + +public enum EquilateralShape { + EQUILATERAL_TRIANGLE { + final String TRIANGLE_HORIZONTAL_SIDE_ELEMENT = "--"; + final String TRIANGLE_LEFT_SIDE_ELEMENT = "/"; + final String TRIANGLE_RIGHT_SIDE_ELEMENT = "\\"; + + @Override + public String createShapeString(int length) { + String triangle = EMPTY_STRING; + + for (int i = 0; i < length; i++) { + for (int j = 0; j < length - i; j++) { + triangle += EMPTY_ELEMENT; + } + triangle += TRIANGLE_LEFT_SIDE_ELEMENT; + + for (int j = 0; j < i * 2; j++) { + triangle += EMPTY_ELEMENT; + } + triangle += TRIANGLE_RIGHT_SIDE_ELEMENT + NEW_LINE_SYMBOL; + } + triangle += EMPTY_ELEMENT; + + for (int i = 0; i < length; i++) { + triangle += TRIANGLE_HORIZONTAL_SIDE_ELEMENT; + } + + return triangle; + } + }, + SQUARE { + final String RECTANGLE_HORIZONTAL_ELEMENT = "-"; + final String RECTANGLE_VERTICAL_ELEMENT = "-"; + + @Override + public String createShapeString(int length) { + String horizontalLine = createHorizontalLine(length); + String verticalLines = createVerticalLines(length); + + return horizontalLine + verticalLines + horizontalLine; + } + + private String createHorizontalLine(int length) { + String horizontalLine = EMPTY_ELEMENT; + + for (int i = 0; i < length; i++) { + horizontalLine += RECTANGLE_HORIZONTAL_ELEMENT; + } + + horizontalLine += EMPTY_ELEMENT + NEW_LINE_SYMBOL; + + return horizontalLine; + } + + private String createVerticalLines(int length) { + String verticalLinesUnit = getVerticalLinesUnit(length); + + String verticalLines = EMPTY_STRING; + + for (int i = 0; i < length; i++) { + verticalLines += verticalLinesUnit; + } + + return verticalLines; + } + + private String getVerticalLinesUnit(int length) { + String verticalLinesUnit = RECTANGLE_VERTICAL_ELEMENT; + + for (int i = 0; i < length; i++) { + verticalLinesUnit += EMPTY_ELEMENT; + } + + verticalLinesUnit += RECTANGLE_VERTICAL_ELEMENT + NEW_LINE_SYMBOL; + + return verticalLinesUnit; + } + }; + + public static final String EMPTY_ELEMENT = " "; + public static final String EMPTY_STRING = ""; + public static final char NEW_LINE_SYMBOL = '\n'; + + public abstract String createShapeString(int length); +} diff --git a/src/com/walking/lesson18_instanceof_getClass/Task1/Main.java b/src/com/walking/lesson18_instanceof_getClass/Task1/Main.java deleted file mode 100644 index 720820534..000000000 --- a/src/com/walking/lesson18_instanceof_getClass/Task1/Main.java +++ /dev/null @@ -1,6 +0,0 @@ -package com.walking.lesson18_instanceof_getClass.Task1; - -public class Main { - public static void main(String[] args) { - } -} diff --git a/src/com/walking/lesson18_instanceof_getClass/task1_getClass/Main.java b/src/com/walking/lesson18_instanceof_getClass/task1_getClass/Main.java index 1993f716e..7cdad7b49 100644 --- a/src/com/walking/lesson18_instanceof_getClass/task1_getClass/Main.java +++ b/src/com/walking/lesson18_instanceof_getClass/task1_getClass/Main.java @@ -1,5 +1,10 @@ package com.walking.lesson18_instanceof_getClass.task1_getClass; +import com.walking.lesson18_instanceof_getClass.task1_getClass.model.Animal; +import com.walking.lesson18_instanceof_getClass.task1_getClass.model.Cat; +import com.walking.lesson18_instanceof_getClass.task1_getClass.model.Cow; +import com.walking.lesson18_instanceof_getClass.task1_getClass.model.Dog; + /** * Реализовать задачу * ... @@ -7,5 +12,26 @@ */ public class Main { public static void main(String[] args) { + Animal[] animals = new Animal[]{new Cow(), new Cat(), new Dog()}; + + soundAll(animals); + } + + private static void soundAll(Animal[] animals) { + for (Animal animal : animals) { + sound(animal); + } + } + + private static void sound(Animal animal) { + if (animal.getClass().equals(Cow.class)) { + ((Cow) animal).moo(); + } else if (animal.getClass().equals(Cat.class)) { + ((Cat) animal).meow(); + } else if (animal.getClass().equals(Dog.class)) { + ((Dog) animal).woof(); + } else { + System.out.println("Unknown animal"); + } } } diff --git a/src/com/walking/lesson18_instanceof_getClass/task1_getClass/model/Animal.java b/src/com/walking/lesson18_instanceof_getClass/task1_getClass/model/Animal.java new file mode 100644 index 000000000..fb01464af --- /dev/null +++ b/src/com/walking/lesson18_instanceof_getClass/task1_getClass/model/Animal.java @@ -0,0 +1,16 @@ +package com.walking.lesson18_instanceof_getClass.task1_getClass.model; + +public class Animal { + // Выполнение доп. условия. Если методы наследников лишь обращаются к sound() - +// нам необходимо делать вывод звука животного в этом классе. Значит, звук животного +// нужно куда-то записать + private final String sound; + + protected Animal(String sound) { + this.sound = sound; + } + + protected void sound() { + System.out.println(sound); + } +} diff --git a/src/com/walking/lesson18_instanceof_getClass/task1_getClass/model/Cat.java b/src/com/walking/lesson18_instanceof_getClass/task1_getClass/model/Cat.java new file mode 100644 index 000000000..175ec9fd4 --- /dev/null +++ b/src/com/walking/lesson18_instanceof_getClass/task1_getClass/model/Cat.java @@ -0,0 +1,13 @@ +package com.walking.lesson18_instanceof_getClass.task1_getClass.model; + +public class Cat extends Animal { + // Передаем параметры в super внутри конструктора, а не принимая их в параметры Cat(), +// чтобы избежать ошибочного поведения при использовании этого класса + public Cat() { + super("meow"); + } + + public void meow() { + sound(); + } +} diff --git a/src/com/walking/lesson18_instanceof_getClass/task1_getClass/model/Cow.java b/src/com/walking/lesson18_instanceof_getClass/task1_getClass/model/Cow.java new file mode 100644 index 000000000..0d6e746bb --- /dev/null +++ b/src/com/walking/lesson18_instanceof_getClass/task1_getClass/model/Cow.java @@ -0,0 +1,13 @@ +package com.walking.lesson18_instanceof_getClass.task1_getClass.model; + +public class Cow extends Animal { + // Передаем параметры в super внутри конструктора, а не принимая их в параметры Cat(), +// чтобы избежать ошибочного поведения при использовании этого класса + public Cow() { + super("moo"); + } + + public void moo() { + sound(); + } +} diff --git a/src/com/walking/lesson18_instanceof_getClass/task1_getClass/model/Dog.java b/src/com/walking/lesson18_instanceof_getClass/task1_getClass/model/Dog.java new file mode 100644 index 000000000..98e68be92 --- /dev/null +++ b/src/com/walking/lesson18_instanceof_getClass/task1_getClass/model/Dog.java @@ -0,0 +1,13 @@ +package com.walking.lesson18_instanceof_getClass.task1_getClass.model; + +public class Dog extends Animal { + // Передаем параметры в super внутри конструктора, а не принимая их в параметры Cat(), +// чтобы избежать ошибочного поведения при использовании этого класса + public Dog() { + super("woof"); + } + + public void woof() { + sound(); + } +} diff --git a/src/com/walking/lesson18_instanceof_getClass/task1_instanceof/Main.java b/src/com/walking/lesson18_instanceof_getClass/task1_instanceof/Main.java index 4f267a04b..d7660ca7e 100644 --- a/src/com/walking/lesson18_instanceof_getClass/task1_instanceof/Main.java +++ b/src/com/walking/lesson18_instanceof_getClass/task1_instanceof/Main.java @@ -1,5 +1,11 @@ package com.walking.lesson18_instanceof_getClass.task1_instanceof; + +import com.walking.lesson18_instanceof_getClass.task1_instanceof.model.Animal; +import com.walking.lesson18_instanceof_getClass.task1_instanceof.model.Cat; +import com.walking.lesson18_instanceof_getClass.task1_instanceof.model.Cow; +import com.walking.lesson18_instanceof_getClass.task1_instanceof.model.Dog; + /** * Реализовать задачу * ... @@ -7,5 +13,27 @@ */ public class Main { public static void main(String[] args) { + Animal[] animals = new Animal[]{new Cow(), new Cat(), new Dog()}; + + soundAll(animals); + + } + + private static void soundAll(Animal[] animals) { + for (Animal animal : animals) { + sound(animal); + } + } + + private static void sound(Animal animal) { + if (animal instanceof Cat cat) { + cat.meow(); + } else if (animal instanceof Dog dog) { + dog.woof(); + } else if (animal instanceof Cow cow) { + cow.moo(); + } else { + System.out.println("Unknown animal"); + } } } diff --git a/src/com/walking/lesson18_instanceof_getClass/task1_instanceof/model/Animal.java b/src/com/walking/lesson18_instanceof_getClass/task1_instanceof/model/Animal.java new file mode 100644 index 000000000..4800543a1 --- /dev/null +++ b/src/com/walking/lesson18_instanceof_getClass/task1_instanceof/model/Animal.java @@ -0,0 +1,16 @@ +package com.walking.lesson18_instanceof_getClass.task1_instanceof.model; + +public class Animal { + // Выполнение доп. условия. Если методы наследников лишь обращаются к sound() - +// нам необходимо делать вывод звука животного в этом классе. Значит, звук животного +// нужно куда-то записать + private final String sound; + + protected Animal(String sound) { + this.sound = sound; + } + + protected void sound() { + System.out.println(sound); + } +} diff --git a/src/com/walking/lesson18_instanceof_getClass/task1_instanceof/model/Cat.java b/src/com/walking/lesson18_instanceof_getClass/task1_instanceof/model/Cat.java new file mode 100644 index 000000000..dd012fc49 --- /dev/null +++ b/src/com/walking/lesson18_instanceof_getClass/task1_instanceof/model/Cat.java @@ -0,0 +1,13 @@ +package com.walking.lesson18_instanceof_getClass.task1_instanceof.model; + +public class Cat extends Animal { + // Передаем параметры в super внутри конструктора, а не принимая их в параметры Cat(), +// чтобы избежать ошибочного поведения при использовании этого класса + public Cat() { + super("meow"); + } + + public void meow() { + sound(); + } +} diff --git a/src/com/walking/lesson18_instanceof_getClass/task1_instanceof/model/Cow.java b/src/com/walking/lesson18_instanceof_getClass/task1_instanceof/model/Cow.java new file mode 100644 index 000000000..819564917 --- /dev/null +++ b/src/com/walking/lesson18_instanceof_getClass/task1_instanceof/model/Cow.java @@ -0,0 +1,13 @@ +package com.walking.lesson18_instanceof_getClass.task1_instanceof.model; + +public class Cow extends Animal { + // Передаем параметры в super внутри конструктора, а не принимая их в параметры Cat(), +// чтобы избежать ошибочного поведения при использовании этого класса + public Cow() { + super("moo"); + } + + public void moo() { + sound(); + } +} diff --git a/src/com/walking/lesson18_instanceof_getClass/task1_instanceof/model/Dog.java b/src/com/walking/lesson18_instanceof_getClass/task1_instanceof/model/Dog.java new file mode 100644 index 000000000..c4e51a628 --- /dev/null +++ b/src/com/walking/lesson18_instanceof_getClass/task1_instanceof/model/Dog.java @@ -0,0 +1,13 @@ +package com.walking.lesson18_instanceof_getClass.task1_instanceof.model; + +public class Dog extends Animal { + // Передаем параметры в super внутри конструктора, а не принимая их в параметры Cat(), +// чтобы избежать ошибочного поведения при использовании этого класса + public Dog() { + super("woof"); + } + + public void woof() { + sound(); + } +} diff --git a/src/com/walking/lesson20_exceptions/task1_catchException/Main.java b/src/com/walking/lesson20_exceptions/task1_catchException/Main.java index c59fa62d4..efcb9ee09 100644 --- a/src/com/walking/lesson20_exceptions/task1_catchException/Main.java +++ b/src/com/walking/lesson20_exceptions/task1_catchException/Main.java @@ -1,5 +1,12 @@ package com.walking.lesson20_exceptions.task1_catchException; +import com.walking.lesson20_exceptions.task1_catchException.model.File; +import com.walking.lesson20_exceptions.task1_catchException.model.InformationType; +import com.walking.lesson20_exceptions.task1_catchException.service.FileService; + +import java.io.FileNotFoundException; +import java.util.Scanner; + /** * Создайте массив, имитирующий простейшую файловую систему и содержащий объекты файлов. *

@@ -15,5 +22,26 @@ */ public class Main { public static void main(String[] args) { + Scanner scanner = new Scanner(System.in); + + FileService fileService = new FileService(initFiles()); + + System.out.println("Enter a file's name: "); + String name = scanner.nextLine(); + + try { + System.out.println(fileService.findFile(name).toString()); + } catch (FileNotFoundException e) { + System.out.println("File with this name not found"); + } + } + + private static File[] initFiles() { + File file1 = new File("text", 140, InformationType.TXT); + File file2 = new File("image", 140, InformationType.JPG); + File file3 = new File("audio", 140, InformationType.MP3); + File file4 = new File("video", 140, InformationType.MP4); + + return new File[]{file1, file2, file3, file4}; } } diff --git a/src/com/walking/lesson20_exceptions/task1_catchException/model/File.java b/src/com/walking/lesson20_exceptions/task1_catchException/model/File.java new file mode 100644 index 000000000..6ae2d49b2 --- /dev/null +++ b/src/com/walking/lesson20_exceptions/task1_catchException/model/File.java @@ -0,0 +1,42 @@ +package com.walking.lesson20_exceptions.task1_catchException.model; + +public class File { + private String name; + private int size; + private InformationType type; + + public File(String name, int size, InformationType type) { + this.name = name; + this.size = size; + this.type = type; + } + + public String getName() { + return name; + } + + public int getSize() { + return size; + } + + public void setName(String name) { + this.name = name; + } + + public void setSize(int size) { + this.size = size; + } + + public InformationType getType() { + return type; + } + + public void setType(InformationType type) { + this.type = type; + } + + @Override + public String toString() { + return "File %s%s size: %d".formatted(getName(), type.getType(), getSize()); + } +} diff --git a/src/com/walking/lesson20_exceptions/task1_catchException/model/InformationType.java b/src/com/walking/lesson20_exceptions/task1_catchException/model/InformationType.java new file mode 100644 index 000000000..590196b82 --- /dev/null +++ b/src/com/walking/lesson20_exceptions/task1_catchException/model/InformationType.java @@ -0,0 +1,18 @@ +package com.walking.lesson20_exceptions.task1_catchException.model; + +public enum InformationType { + TXT(".txt"), + JPG(".jpg"), + MP3(".mp3"), + MP4(".mp4"); + + private final String type; + + InformationType(String type) { + this.type = type; + } + + public String getType() { + return type; + } +} diff --git a/src/com/walking/lesson20_exceptions/task1_catchException/service/FileService.java b/src/com/walking/lesson20_exceptions/task1_catchException/service/FileService.java new file mode 100644 index 000000000..4fe74f6dc --- /dev/null +++ b/src/com/walking/lesson20_exceptions/task1_catchException/service/FileService.java @@ -0,0 +1,23 @@ +package com.walking.lesson20_exceptions.task1_catchException.service; + +import com.walking.lesson20_exceptions.task1_catchException.model.File; + +import java.io.FileNotFoundException; + +public class FileService { + private final File[] files; + + public FileService(File[] files) { + this.files = files; + } + + public File findFile(String name) throws FileNotFoundException { + for (File file : files) { + if (file.getName().equals(name)) { + return file; + // Всё сделал сам, но не додумался в методе поменять throw и return местами в медоте( + } + } + throw new FileNotFoundException("File not found"); + } +} diff --git a/src/com/walking/lesson20_exceptions/task1_throwsException/Main.java b/src/com/walking/lesson20_exceptions/task1_throwsException/Main.java index 368d583c8..fde2977ca 100644 --- a/src/com/walking/lesson20_exceptions/task1_throwsException/Main.java +++ b/src/com/walking/lesson20_exceptions/task1_throwsException/Main.java @@ -1,5 +1,12 @@ package com.walking.lesson20_exceptions.task1_throwsException; +import com.walking.lesson20_exceptions.task1_throwsException.model.File; +import com.walking.lesson20_exceptions.task1_throwsException.model.InformationType; +import com.walking.lesson20_exceptions.task1_throwsException.service.FileService; + +import java.io.FileNotFoundException; +import java.util.Scanner; + /** * Создайте массив, имитирующий простейшую файловую систему и содержащий объекты файлов. *

@@ -16,6 +23,31 @@ * Подсказка: throws можно использовать в том числе в main(). */ public class Main { - public static void main(String[] args) { + public static void main(String[] args) throws FileNotFoundException { + Scanner scanner = new Scanner(System.in); + + FileService fileService = new FileService(initFiles()); + + System.out.println("Enter a file's name: "); + String name = scanner.nextLine(); + + System.out.println(fileService.findFile(name).toString()); + + + // Очень сильно прошу объяснить разницу между обычной "Всплывающей" ошибкой + // если код написан неправильно, но его удалось запустить, + // и этой итеррацией задачи, а именно всплывающем сообщении, + // ибо процесс завершается с ОДНИМ выходным кодом, + // а не НУЛЁМ, как это обычно бывает при верном решении задач. + // при том, что я запускал + } + + private static File[] initFiles() { + File file1 = new File("text", 140, InformationType.TXT); + File file2 = new File("image", 140, InformationType.JPG); + File file3 = new File("audio", 140, InformationType.MP3); + File file4 = new File("video", 140, InformationType.MP4); + + return new File[]{file1, file2, file3, file4}; } } diff --git a/src/com/walking/lesson20_exceptions/task1_throwsException/model/File.java b/src/com/walking/lesson20_exceptions/task1_throwsException/model/File.java new file mode 100644 index 000000000..109d38c6d --- /dev/null +++ b/src/com/walking/lesson20_exceptions/task1_throwsException/model/File.java @@ -0,0 +1,42 @@ +package com.walking.lesson20_exceptions.task1_throwsException.model; + +public class File { + private String name; + private int size; + private InformationType type; + + public File(String name, int size, InformationType type) { + this.name = name; + this.size = size; + this.type = type; + } + + public String getName() { + return name; + } + + public int getSize() { + return size; + } + + public void setName(String name) { + this.name = name; + } + + public void setSize(int size) { + this.size = size; + } + + public InformationType getType() { + return type; + } + + public void setType(InformationType type) { + this.type = type; + } + + @Override + public String toString() { + return "File %s%s size: %d".formatted(getName(), type.getType(), getSize()); + } +} diff --git a/src/com/walking/lesson20_exceptions/task1_throwsException/model/InformationType.java b/src/com/walking/lesson20_exceptions/task1_throwsException/model/InformationType.java new file mode 100644 index 000000000..e5102b3c1 --- /dev/null +++ b/src/com/walking/lesson20_exceptions/task1_throwsException/model/InformationType.java @@ -0,0 +1,18 @@ +package com.walking.lesson20_exceptions.task1_throwsException.model; + +public enum InformationType { + TXT(".txt"), + JPG(".jpg"), + MP3(".mp3"), + MP4(".mp4"); + + private final String type; + + InformationType(String type) { + this.type = type; + } + + public String getType() { + return type; + } +} diff --git a/src/com/walking/lesson20_exceptions/task1_throwsException/service/FileService.java b/src/com/walking/lesson20_exceptions/task1_throwsException/service/FileService.java new file mode 100644 index 000000000..6f5d5875a --- /dev/null +++ b/src/com/walking/lesson20_exceptions/task1_throwsException/service/FileService.java @@ -0,0 +1,23 @@ +package com.walking.lesson20_exceptions.task1_throwsException.service; + +import com.walking.lesson20_exceptions.task1_throwsException.model.File; + +import java.io.FileNotFoundException; + +public class FileService { + private final File[] files; + + public FileService(File[] files) { + this.files = files; + } + + public File findFile(String name) throws FileNotFoundException { + for (File x : files) { + if (x.getName().equals(name)) { + return x; + // Всё сделал сам, но не додумался в методе поменять throw и return местами в медоте( + } + } + throw new FileNotFoundException("File not found"); + } +} diff --git a/src/com/walking/lesson20_exceptions/task2/InvalidValidationException.java b/src/com/walking/lesson20_exceptions/task2/InvalidValidationException.java new file mode 100644 index 000000000..a956f02a1 --- /dev/null +++ b/src/com/walking/lesson20_exceptions/task2/InvalidValidationException.java @@ -0,0 +1,13 @@ +package com.walking.lesson20_exceptions.task2; + +public class InvalidValidationException extends RuntimeException { + + public InvalidValidationException(String message) { + super(message); + } + + @Override + public String toString() { + return super.getMessage(); + } +} diff --git a/src/com/walking/lesson20_exceptions/task2/Main.java b/src/com/walking/lesson20_exceptions/task2/Main.java index cccb443bf..a95976d5e 100644 --- a/src/com/walking/lesson20_exceptions/task2/Main.java +++ b/src/com/walking/lesson20_exceptions/task2/Main.java @@ -1,5 +1,11 @@ package com.walking.lesson20_exceptions.task2; +import com.walking.lesson20_exceptions.task2.model.EquilateralShape; +import com.walking.lesson20_exceptions.task2.model.EquilateralTriangle; +import com.walking.lesson20_exceptions.task2.model.Square; + +import java.util.Scanner; + /** * Реализуйте любой из вариантов Задачи 1 в уроке 16. * При некорректном вводе с клавиатуры выбрасывайте собственное исключение InputValidationException. @@ -9,5 +15,42 @@ */ public class Main { public static void main(String[] args) { + Scanner scanner = new Scanner(System.in); + + System.out.print("Enter shape's length: "); + int length = scanner.nextInt(); + + if (length < 1) { + throw new InvalidValidationException("Length can't be less than 1!"); + } + + System.out.println("Enter shape's type:\n 1: Square\n 2: Triangle\n"); + int shapeType = scanner.nextInt(); + + String shapeString = createShapeString(length, shapeType); + System.out.println(shapeString); + } + + private static String createShapeString(int length, int type) { + // почему если здесь не указывать throws, код все равно работает корректно??? + + if (length < 1) { + throw new InvalidValidationException("Length can't be less than 1"); + } + + EquilateralShape shape; + + switch (type) { + case 1: + shape = new Square(length); + break; + case 2: + shape = new EquilateralTriangle(length); + break; + default: + throw new InvalidValidationException("Unknown shape type"); + } + + return shape.createShapeString(); } } diff --git a/src/com/walking/lesson20_exceptions/task2/model/EquilateralShape.java b/src/com/walking/lesson20_exceptions/task2/model/EquilateralShape.java new file mode 100644 index 000000000..4d39c856c --- /dev/null +++ b/src/com/walking/lesson20_exceptions/task2/model/EquilateralShape.java @@ -0,0 +1,19 @@ +package com.walking.lesson20_exceptions.task2.model; + +public abstract class EquilateralShape { + public static final String EMPTY_ELEMENT = " "; + public static final String EMPTY_STRING = ""; + public static final String NEW_LINE_SYMBOL = "\n"; + + protected final int length; + + public EquilateralShape(int length) { + this.length = length; + } + + public int getLength() { + return length; + } + + public abstract String createShapeString(); +} diff --git a/src/com/walking/lesson20_exceptions/task2/model/EquilateralTriangle.java b/src/com/walking/lesson20_exceptions/task2/model/EquilateralTriangle.java new file mode 100644 index 000000000..13b9eece1 --- /dev/null +++ b/src/com/walking/lesson20_exceptions/task2/model/EquilateralTriangle.java @@ -0,0 +1,35 @@ +package com.walking.lesson20_exceptions.task2.model; + +public class EquilateralTriangle extends EquilateralShape { + public static final String TRIANGLE_HORIZONTAL_SIDE_ELEMENT = "--"; + public static final String TRIANGLE_LEFT_SIDE_ELEMENT = "/"; + public static final String TRIANGLE_RIGHT_SIDE_ELEMENT = "\\"; + + public EquilateralTriangle(int length) { + super(length); + } + + @Override + public String createShapeString() { + String triangle = EMPTY_STRING; + + for (int i = 0; i < length; i++) { + for (int j = 0; j < length - i; j++) { + triangle += EMPTY_ELEMENT; + } + triangle += TRIANGLE_LEFT_SIDE_ELEMENT; + + for (int j = 0; j < i * 2; j++) { + triangle += EMPTY_ELEMENT; + } + triangle += TRIANGLE_RIGHT_SIDE_ELEMENT + NEW_LINE_SYMBOL; + } + triangle += EMPTY_ELEMENT; + + for (int i = 0; i < length; i++) { + triangle += TRIANGLE_HORIZONTAL_SIDE_ELEMENT; + } + + return triangle; + } +} diff --git a/src/com/walking/lesson20_exceptions/task2/model/Square.java b/src/com/walking/lesson20_exceptions/task2/model/Square.java new file mode 100644 index 000000000..52d39af20 --- /dev/null +++ b/src/com/walking/lesson20_exceptions/task2/model/Square.java @@ -0,0 +1,54 @@ +package com.walking.lesson20_exceptions.task2.model; + +public class Square extends EquilateralShape { + public static final String RECTANGLE_HORIZONTAL_ELEMENT = "-"; + public static final String RECTANGLE_VERTICAL_ELEMENT = "-"; + + public Square(int length) { + super(length); + } + + @Override + public String createShapeString() { + String horizontalLine = createHorizontalLine(); + String verticalLines = createVerticalLines(); + + return horizontalLine + verticalLines + horizontalLine; + } + + private String createHorizontalLine() { + String horizontalLine = EMPTY_ELEMENT; + + for (int i = 0; i < length; i++) { + horizontalLine += RECTANGLE_HORIZONTAL_ELEMENT; + } + + horizontalLine += EMPTY_ELEMENT + NEW_LINE_SYMBOL; + + return horizontalLine; + } + + private String createVerticalLines() { + String verticalLinesUnit = getVerticalLinesUnit(); + + String vertcalLines = EMPTY_STRING; + + for (int i = 0; i < length; i++) { + vertcalLines += verticalLinesUnit; + } + + return vertcalLines; + } + + private String getVerticalLinesUnit() { + String verticalLineUnit = RECTANGLE_VERTICAL_ELEMENT; + + for (int i = 0; i < length; i++) { + verticalLineUnit += EMPTY_ELEMENT; + } + + verticalLineUnit += RECTANGLE_VERTICAL_ELEMENT + NEW_LINE_SYMBOL; + + return verticalLineUnit; + } +} diff --git a/src/com/walking/lesson20_exceptions/task3/Main.java b/src/com/walking/lesson20_exceptions/task3/Main.java index 3b81b191c..07a0828c6 100644 --- a/src/com/walking/lesson20_exceptions/task3/Main.java +++ b/src/com/walking/lesson20_exceptions/task3/Main.java @@ -1,5 +1,9 @@ package com.walking.lesson20_exceptions.task3; +import com.walking.lesson20_exceptions.task3.exception.ArrayValidationException; +import com.walking.lesson20_exceptions.task3.exception.UnknownAnimalException; +import com.walking.lesson20_exceptions.task3.model.*; + /** * Реализуйте любой из вариантов задачи в уроке 18. * Для ситуации, когда тип животного неизвестен, выбрасывайте собственное исключение UnknownAnimalException. @@ -11,5 +15,30 @@ */ public class Main { public static void main(String[] args) { + Animal[] animals = new Animal[]{new Cow(), new Cat(), new Dog(), new Bee() }; + + soundAll(animals); + } + + private static void soundAll(Animal[] animals) throws ArrayValidationException { + for (int i = 0; i < animals.length; i++) { + if (animals[i] == null) { + throw new ArrayValidationException("Index " + i + " is null"); + } + + sound(animals[i]); + } + } + + private static void sound(Animal animal) { + if (animal instanceof Cat cat) { + cat.meow(); + } else if (animal instanceof Dog dog) { + dog.woof(); + } else if (animal instanceof Cow cow) { + cow.moo(); + } else { + throw new UnknownAnimalException("Unknown animal"); + } } } diff --git a/src/com/walking/lesson20_exceptions/task3/exception/ArrayValidationException.java b/src/com/walking/lesson20_exceptions/task3/exception/ArrayValidationException.java new file mode 100644 index 000000000..c0f3c4ff9 --- /dev/null +++ b/src/com/walking/lesson20_exceptions/task3/exception/ArrayValidationException.java @@ -0,0 +1,7 @@ +package com.walking.lesson20_exceptions.task3.exception; + +public class ArrayValidationException extends RuntimeException { + public ArrayValidationException(String message) { + super(message); + } +} diff --git a/src/com/walking/lesson20_exceptions/task3/exception/UnknownAnimalException.java b/src/com/walking/lesson20_exceptions/task3/exception/UnknownAnimalException.java new file mode 100644 index 000000000..598d792c0 --- /dev/null +++ b/src/com/walking/lesson20_exceptions/task3/exception/UnknownAnimalException.java @@ -0,0 +1,8 @@ +package com.walking.lesson20_exceptions.task3.exception; + +public class UnknownAnimalException extends RuntimeException { + public UnknownAnimalException(String message) { + super(message); + } + +} diff --git a/src/com/walking/lesson20_exceptions/task3/model/Animal.java b/src/com/walking/lesson20_exceptions/task3/model/Animal.java new file mode 100644 index 000000000..9f4406331 --- /dev/null +++ b/src/com/walking/lesson20_exceptions/task3/model/Animal.java @@ -0,0 +1,13 @@ +package com.walking.lesson20_exceptions.task3.model; + +public class Animal { + private final String sound; + + protected Animal(String sound) { + this.sound = sound; + } + + protected void sound() { + System.out.println(sound); + } +} diff --git a/src/com/walking/lesson20_exceptions/task3/model/Bee.java b/src/com/walking/lesson20_exceptions/task3/model/Bee.java new file mode 100644 index 000000000..737c9dee7 --- /dev/null +++ b/src/com/walking/lesson20_exceptions/task3/model/Bee.java @@ -0,0 +1,11 @@ +package com.walking.lesson20_exceptions.task3.model; + +public class Bee extends Animal { + public Bee() { + super("bzzz"); + } + + public void bzzz() { + sound(); + } +} diff --git a/src/com/walking/lesson20_exceptions/task3/model/Cat.java b/src/com/walking/lesson20_exceptions/task3/model/Cat.java new file mode 100644 index 000000000..e082e23c5 --- /dev/null +++ b/src/com/walking/lesson20_exceptions/task3/model/Cat.java @@ -0,0 +1,11 @@ +package com.walking.lesson20_exceptions.task3.model; + +public class Cat extends Animal { + public Cat() { + super("meow"); + } + + public void meow() { + sound(); + } +} diff --git a/src/com/walking/lesson20_exceptions/task3/model/Cow.java b/src/com/walking/lesson20_exceptions/task3/model/Cow.java new file mode 100644 index 000000000..ef3a67264 --- /dev/null +++ b/src/com/walking/lesson20_exceptions/task3/model/Cow.java @@ -0,0 +1,11 @@ +package com.walking.lesson20_exceptions.task3.model; + +public class Cow extends Animal { + public Cow() { + super("moo"); + } + + public void moo() { + sound(); + } +} diff --git a/src/com/walking/lesson20_exceptions/task3/model/Dog.java b/src/com/walking/lesson20_exceptions/task3/model/Dog.java new file mode 100644 index 000000000..bccc13451 --- /dev/null +++ b/src/com/walking/lesson20_exceptions/task3/model/Dog.java @@ -0,0 +1,11 @@ +package com.walking.lesson20_exceptions.task3.model; + +public class Dog extends Animal { + public Dog() { + super("woof"); + } + + public void woof() { + sound(); + } +} diff --git a/src/com/walking/lesson21_immutable_object/CarNotFoundException.java b/src/com/walking/lesson21_immutable_object/CarNotFoundException.java new file mode 100644 index 000000000..9b1c2be2b --- /dev/null +++ b/src/com/walking/lesson21_immutable_object/CarNotFoundException.java @@ -0,0 +1,7 @@ +package com.walking.lesson21_immutable_object; + +public class CarNotFoundException extends RuntimeException { + public CarNotFoundException() { + super("Car not found"); + } +} diff --git a/src/com/walking/lesson21_immutable_object/Main.java b/src/com/walking/lesson21_immutable_object/Main.java index 6027e7453..91cf12e48 100644 --- a/src/com/walking/lesson21_immutable_object/Main.java +++ b/src/com/walking/lesson21_immutable_object/Main.java @@ -1,5 +1,11 @@ package com.walking.lesson21_immutable_object; +import com.walking.lesson21_immutable_object.model.Car; +import com.walking.lesson21_immutable_object.model.CarIdentifier; +import com.walking.lesson21_immutable_object.service.CarService; + +import java.util.Scanner; + /** * Реализуйте задачу из урока 19. *

@@ -10,5 +16,45 @@ */ public class Main { public static void main(String[] args) { + CarService carService = new CarService(initCars()); + + CarIdentifier desiredCar = requireCarsInformation(); + + Car foundCar = carService.findCar(desiredCar); + System.out.println(foundCar); + + + // тупо переписал твоё решение - сам не додумался, + // что можно отдельный класс идентификатора создать в классе САR + } + + private static CarIdentifier requireCarsInformation() { + + Scanner scanner = new Scanner(System.in); + + System.out.print("Enter a car's number: "); + String number = scanner.nextLine(); + + System.out.print("Enter a car's year: "); + int year = scanner.nextInt(); + + scanner.close(); + + return new CarIdentifier(number, year); + } + + private static Car[] initCars() { + Car car1 = new Car("RR-111-RR", 2015, "yellow", true); + Car car2 = new Car("RR-222-RR", 2016, "yellow", true); + Car car3 = new Car("RR-333-RR", 2017, "yellow", true); + Car car4 = new Car("RR-444-RR", 2018, "yellow", true); + Car car5 = new Car("RR-555-RR", 2018, "yellow", true); + Car car6 = new Car("RR-666-RR", 2018, "yellow", true); + Car car7 = new Car("RR-777-RR", 2018, "yellow", true); + Car car8 = new Car("RR-888-RR", 2018, "yellow", true); + Car car9 = new Car("RR-999-RR", 2018, "yellow", true); + Car car10 = new Car("RR-000-RR", 2018, "yellow", true); + + return new Car[]{car1, car2, car3, car4, car5, car6, car7, car8, car9, car10}; } } diff --git a/src/com/walking/lesson21_immutable_object/model/Car.java b/src/com/walking/lesson21_immutable_object/model/Car.java new file mode 100644 index 000000000..ea07486aa --- /dev/null +++ b/src/com/walking/lesson21_immutable_object/model/Car.java @@ -0,0 +1,48 @@ +package com.walking.lesson21_immutable_object.model; + +public class Car { + private final CarIdentifier identifier; + private String color; + private boolean actualTechnicalInspection; + + public Car(CarIdentifier identifier, String color, boolean actualTechnicalInspection) { + this.identifier = identifier; + this.color = color; + this.actualTechnicalInspection = actualTechnicalInspection; + } + + public Car(String number, int year, String color, boolean actualTechnicalInspection) { + this(new CarIdentifier(number, year), color, actualTechnicalInspection); + } + + public CarIdentifier getIdentifier() { + return identifier; + } + + public String getColor() { + return color; + } + + public void setColor(String color) { + this.color = color; + } + + public boolean isActualTechnicalInspection() { + return actualTechnicalInspection; + } + + public void setActualTechnicalInspection(boolean actualTechnicalInspection) { + this.actualTechnicalInspection = actualTechnicalInspection; + } + + @Override + public String toString() { + return """ + number: %s + year: %d + color: %s + actualTechnicalInspection: %s + """.formatted(identifier.getNumber(), identifier.getYear(), color, + actualTechnicalInspection ? "actual" : "not actual"); + } +} diff --git a/src/com/walking/lesson21_immutable_object/model/CarIdentifier.java b/src/com/walking/lesson21_immutable_object/model/CarIdentifier.java new file mode 100644 index 000000000..32ed3b658 --- /dev/null +++ b/src/com/walking/lesson21_immutable_object/model/CarIdentifier.java @@ -0,0 +1,46 @@ +package com.walking.lesson21_immutable_object.model; + +import java.util.Objects; + +public final class CarIdentifier { + + private final String number; + private final int year; + + public CarIdentifier(String number, int year) { + this.number = number; + this.year = year; + } + + public String getNumber() { + return number; + } + + public int getYear() { + return year; + } + + @Override + public boolean equals(Object o) { + if (this == o) { + return true; + } + + if (o == null || !getClass().equals(o.getClass())) { + return false; + } + + CarIdentifier identifier = (CarIdentifier) o; + + return year == identifier.year && Objects.equals(number, identifier.number); + } + + @Override + public int hashCode() { + int hashcode = number.hashCode(); + + hashcode += 31 * year; + + return hashcode; + } +} diff --git a/src/com/walking/lesson21_immutable_object/service/CarService.java b/src/com/walking/lesson21_immutable_object/service/CarService.java new file mode 100644 index 000000000..8e569c720 --- /dev/null +++ b/src/com/walking/lesson21_immutable_object/service/CarService.java @@ -0,0 +1,22 @@ +package com.walking.lesson21_immutable_object.service; + +import com.walking.lesson21_immutable_object.CarNotFoundException; +import com.walking.lesson21_immutable_object.model.Car; +import com.walking.lesson21_immutable_object.model.CarIdentifier; + +public class CarService { + private final Car[] cars; + + public CarService(Car[] cars) { + this.cars = cars; + } + + public Car findCar(CarIdentifier identifier) throws CarNotFoundException { + for (Car c : cars) { + if (c.getIdentifier().equals(identifier)) { + return c; + } + } + throw new CarNotFoundException(); + } +} diff --git a/src/com/walking/lesson25_nested_classes/task1/anonymous_class/Main.java b/src/com/walking/lesson25_nested_classes/task1/anonymous_class/Main.java index 8025e454c..f9ad66574 100644 --- a/src/com/walking/lesson25_nested_classes/task1/anonymous_class/Main.java +++ b/src/com/walking/lesson25_nested_classes/task1/anonymous_class/Main.java @@ -1,11 +1,143 @@ package com.walking.lesson25_nested_classes.task1.anonymous_class; +import com.walking.lesson25_nested_classes.task1.inner_class.model.EquilateralShape; + +import java.util.Scanner; + /** * Реализуйте задачу * ... * используя анонимные классы. */ public class Main { + public static final String RECTANGLE_HORIZONTAL_ELEMENT = "-"; + public static final String RECTANGLE_VERTICAL_ELEMENT = "-"; + public static final String TRIANGLE_HORIZONTAL_SIDE_ELEMENT = "--"; + public static final String TRIANGLE_LEFT_SIDE_ELEMENT = "/"; + public static final String TRIANGLE_RIGHT_SIDE_ELEMENT = "\\"; + public static void main(String[] args) { + Scanner scanner = new Scanner(System.in); + + System.out.print("Enter shape's length: "); + int length = scanner.nextInt(); + + if (length < 1) { + scanner.close(); + throw new RuntimeException("Length can't be less than 1"); + } + + System.out.print("Enter shape's type:\n 1: Square\n 2: Triangle\n"); + int shapeType = scanner.nextInt(); + + scanner.close(); + + String shapeString = createShapeString(length, shapeType); + System.out.println(shapeString); + } + + private static String createShapeString(int length, int type) { + EquilateralShape shape; + + switch (type) { + case 1: + shape = createSquare(length); + break; + case 2: + shape = createEquilateralTriangle(length); + break; + default: + throw new RuntimeException("Unknown shape"); + } + + return shape.createShapeString(); + } + + private static EquilateralShape createEquilateralTriangle(int length) { + return new EquilateralShape() { + + @Override + public String createShapeString() { + String triangle = EMPTY_STRING; + + for (int i = 0; i < length; i++) { + for (int j = 0; j < length - i; j++) { + triangle += EMPTY_ELEMENT; + } + triangle += TRIANGLE_LEFT_SIDE_ELEMENT; + + for (int j = 0; j < i * 2; j++) { + triangle += EMPTY_ELEMENT; + } + triangle += TRIANGLE_RIGHT_SIDE_ELEMENT + NEW_LINE_SYMBOL; + } + triangle += EMPTY_ELEMENT; + + for (int i = 0; i < length; i++) { + triangle += TRIANGLE_HORIZONTAL_SIDE_ELEMENT; + } + + return triangle; + } + + @Override + public int getLength() { + return length; + } + }; + } + + private static EquilateralShape createSquare(int length) { + return new EquilateralShape() { + + @Override + public String createShapeString() { + String horizontalLine = createHorizontalLine(); + String verticalLines = createVerticalLines(); + + return horizontalLine + verticalLines + horizontalLine; + } + + @Override + public int getLength() { + return length; + } + + private String createHorizontalLine() { + String horizontalLine = EMPTY_ELEMENT; + + for (int i = 0; i < length; i++) { + horizontalLine += RECTANGLE_HORIZONTAL_ELEMENT; + } + + horizontalLine += EMPTY_ELEMENT + NEW_LINE_SYMBOL; + + return horizontalLine; + } + + private String createVerticalLines() { + String verticalLinesUnit = getVerticalLinesUnit(); + + String verticalLines = EMPTY_STRING; + + for (int i = 0; i < length; i++) { + verticalLines += verticalLinesUnit; + } + + return verticalLines; + } + + private String getVerticalLinesUnit() { + String verticalLinesUnit = RECTANGLE_VERTICAL_ELEMENT; + + for (int i = 0; i < length; i++) { + verticalLinesUnit += EMPTY_ELEMENT; + } + + verticalLinesUnit += RECTANGLE_VERTICAL_ELEMENT + NEW_LINE_SYMBOL; + + return verticalLinesUnit; + } + }; } } diff --git a/src/com/walking/lesson25_nested_classes/task1/anonymous_class/model/EquiliteralShape.java b/src/com/walking/lesson25_nested_classes/task1/anonymous_class/model/EquiliteralShape.java new file mode 100644 index 000000000..c8ce274bc --- /dev/null +++ b/src/com/walking/lesson25_nested_classes/task1/anonymous_class/model/EquiliteralShape.java @@ -0,0 +1,11 @@ +package com.walking.lesson25_nested_classes.task1.anonymous_class.model; + +public interface EquiliteralShape { + String EMPTY_ELEMENT = " "; + String EMPTY_STRING = ""; + char NEW_LINE_SYMBOL = '\n'; + + String createShapeString(); + + int getLength(); +} diff --git a/src/com/walking/lesson25_nested_classes/task1/inner_class/Main.java b/src/com/walking/lesson25_nested_classes/task1/inner_class/Main.java index add78eefc..0d9241c60 100644 --- a/src/com/walking/lesson25_nested_classes/task1/inner_class/Main.java +++ b/src/com/walking/lesson25_nested_classes/task1/inner_class/Main.java @@ -1,11 +1,149 @@ package com.walking.lesson25_nested_classes.task1.inner_class; +import com.walking.lesson25_nested_classes.task1.inner_class.model.EquilateralShape; + +import java.util.Scanner; + /** * Реализуйте задачу * ... * используя внутренние классы. */ public class Main { + public static final String TRIANGLE_HORIZONTAL_SIDE_ELEMENT = "--"; + public static final String TRIANGLE_LEFT_SIDE_ELEMENT = "/"; + public static final String TRIANGLE_RIGHT_SIDE_ELEMENT = "\\"; + public static final String RECTANGLE_HORIZONTAL_ELEMENT = "-"; + public static final String RECTANGLE_VERTICAL_ELEMENT = "|"; + public static void main(String[] args) { + Scanner scanner = new Scanner(System.in); + + System.out.print("Enter shape's length: "); + int length = scanner.nextInt(); + + if (length < 1) { + scanner.close(); + throw new RuntimeException("Incorrect Length"); + } + + System.out.print("Enter shape's type:\n 1: Square\n 2: Triangle\n"); + int shapeType = scanner.nextInt(); + + scanner.close(); + + String shapeString = new Main().createShapeString(length, shapeType); + System.out.println(shapeString); + } + + private String createShapeString(int length, int type) { + EquilateralShape shape; + + switch (type) { + case 1: + shape = new Square(length); + break; + case 2: + shape = new EquilateralTriangle(length); + break; + default: + throw new RuntimeException("Incorrect figure"); + } + + return shape.createShapeString(); + } + + private class EquilateralTriangle implements EquilateralShape { + private final int length; + + public EquilateralTriangle(int length) { + this.length = length; + } + + @Override + public String createShapeString() { + String triangle = EMPTY_STRING; + + for (int i = 0; i < length; i++) { + for (int j = 0; j < length - i; j++) { + triangle += EMPTY_ELEMENT; + } + triangle += TRIANGLE_LEFT_SIDE_ELEMENT; + + for (int j = 0; j < i * 2; j++) { + triangle += EMPTY_ELEMENT; + } + triangle += TRIANGLE_RIGHT_SIDE_ELEMENT + NEW_LINE_SYMBOL; + } + triangle += EMPTY_ELEMENT; + + for (int i = 0; i < length; i++) { + triangle += TRIANGLE_HORIZONTAL_SIDE_ELEMENT; + } + + return triangle; + } + + @Override + public int getLength() { + return length; + } + } + + private class Square implements EquilateralShape { + private final int length; + + public Square(int length) { + this.length = length; + } + + @Override + public String createShapeString() { + String horizontalLine = createHorizontalLine(); + String verticalLines = createVerticalLines(); + + return horizontalLine + verticalLines + horizontalLine; + } + + @Override + public int getLength() { + return length; + } + + private String createHorizontalLine() { + String horizontalLine = EMPTY_ELEMENT; + + for (int i = 0; i < length; i++) { + horizontalLine += RECTANGLE_HORIZONTAL_ELEMENT; + } + + horizontalLine += EMPTY_ELEMENT + NEW_LINE_SYMBOL; + + return horizontalLine; + } + + private String createVerticalLines() { + String verticalLinesUnit = getVerticalLinesUnit(); + + String verticalLines = EMPTY_STRING; + + for (int i = 0; i < length; i++) { + verticalLines += verticalLinesUnit; + } + + return verticalLines; + } + + private String getVerticalLinesUnit() { + String verticalLinesUnit = RECTANGLE_VERTICAL_ELEMENT; + + for (int i = 0; i < length; i++) { + verticalLinesUnit += EMPTY_ELEMENT; + } + + verticalLinesUnit += RECTANGLE_VERTICAL_ELEMENT + NEW_LINE_SYMBOL; + + return verticalLinesUnit; + } } } diff --git a/src/com/walking/lesson25_nested_classes/task1/inner_class/model/EquilateralShape.java b/src/com/walking/lesson25_nested_classes/task1/inner_class/model/EquilateralShape.java new file mode 100644 index 000000000..f7113ba83 --- /dev/null +++ b/src/com/walking/lesson25_nested_classes/task1/inner_class/model/EquilateralShape.java @@ -0,0 +1,12 @@ +package com.walking.lesson25_nested_classes.task1.inner_class.model; + +public interface EquilateralShape { + String EMPTY_ELEMENT = " "; + String EMPTY_STRING = ""; + char NEW_LINE_SYMBOL = '\n'; + + + String createShapeString(); + + int getLength(); +} diff --git a/src/com/walking/lesson25_nested_classes/task1/static_class/Main.java b/src/com/walking/lesson25_nested_classes/task1/static_class/Main.java index deef3aa47..d8116f90d 100644 --- a/src/com/walking/lesson25_nested_classes/task1/static_class/Main.java +++ b/src/com/walking/lesson25_nested_classes/task1/static_class/Main.java @@ -1,11 +1,150 @@ package com.walking.lesson25_nested_classes.task1.static_class; +import com.walking.lesson25_nested_classes.task1.static_class.model.EquilateralShape; + +import java.util.Scanner; + /** * Реализуйте задачу * ... * используя статические вложенные классы. */ public class Main { + public static final String TRIANGLE_HORIZONTAL_SIDE_ELEMENT = "--"; + public static final String TRIANGLE_LEFT_SIDE_ELEMENT = "/"; + public static final String TRIANGLE_RIGHT_SIDE_ELEMENT = "\\"; + public static final String RECTANGLE_HORIZONTAL_ELEMENT = "-"; + public static final String RECTANGLE_VERTICAL_ELEMENT = "-"; + public static void main(String[] args) { + Scanner scanner = new Scanner(System.in); + + System.out.print("Enter shape's length: "); + int length = scanner.nextInt(); + + if (length < 1) { + scanner.close(); + throw new RuntimeException("Incorrect length"); + } + + System.out.print("Enter shape's type:\n 1: Square\n 2: Triangle\n"); + int shapeType = scanner.nextInt(); + + scanner.close(); + + String shapeString = createShapeString(length, shapeType); + System.out.println(shapeString); + + } + + private static String createShapeString(int length, int type) { + EquilateralShape shape; + + switch (type) { + case 1: + shape = new Square(length); + break; + case 2: + shape = new EquilateralTriangle(length); + break; + default: + throw new RuntimeException("Incorrect figure"); + } + + return shape.createShapeString(); + } + + private static class EquilateralTriangle implements EquilateralShape { + private final int length; + + public EquilateralTriangle(int length) { + this.length = length; + } + + @Override + public String createShapeString() { + String triangle = EMPTY_STRING; + + for (int i = 0; i < length; i++) { + for (int j = 0; j < length - i; j++) { + triangle += EMPTY_ELEMENT; + } + triangle += TRIANGLE_LEFT_SIDE_ELEMENT; + + for (int j = 0; j < i * 2; j++) { + triangle += EMPTY_ELEMENT; + } + triangle += TRIANGLE_RIGHT_SIDE_ELEMENT + NEW_LINE_SYMBOL; + } + triangle += EMPTY_ELEMENT; + + for (int i = 0; i < length; i++) { + triangle += TRIANGLE_HORIZONTAL_SIDE_ELEMENT; + } + + return triangle; + } + + @Override + public int getLength() { + return length; + } + } + + private static class Square implements EquilateralShape { + private final int length; + + public Square(int length) { + this.length = length; + } + + @Override + public String createShapeString() { + String horizontalLine = createHorizontalLine(); + String verticalLines = createVerticalLines(); + + return horizontalLine + verticalLines + horizontalLine; + } + + @Override + public int getLength() { + return length; + } + + private String createHorizontalLine() { + String horizontalLine = EMPTY_ELEMENT; + + for (int i = 0; i < length; i++) { + horizontalLine += RECTANGLE_HORIZONTAL_ELEMENT; + } + + horizontalLine += EMPTY_ELEMENT + NEW_LINE_SYMBOL; + + return horizontalLine; + } + + private String createVerticalLines() { + String verticalLinesUnit = getVerticalLinesUnit(); + + String verticalLines = EMPTY_STRING; + + for (int i = 0; i < length; i++) { + verticalLines += verticalLinesUnit; + } + + return verticalLines; + } + + private String getVerticalLinesUnit() { + String verticalLinesUnit = RECTANGLE_VERTICAL_ELEMENT; + + for (int i = 0; i < length; i++) { + verticalLinesUnit += EMPTY_ELEMENT; + } + + verticalLinesUnit += RECTANGLE_VERTICAL_ELEMENT + NEW_LINE_SYMBOL; + + return verticalLinesUnit; + } } } diff --git a/src/com/walking/lesson25_nested_classes/task1/static_class/model/EquilateralShape.java b/src/com/walking/lesson25_nested_classes/task1/static_class/model/EquilateralShape.java new file mode 100644 index 000000000..99255ec2a --- /dev/null +++ b/src/com/walking/lesson25_nested_classes/task1/static_class/model/EquilateralShape.java @@ -0,0 +1,11 @@ +package com.walking.lesson25_nested_classes.task1.static_class.model; + +public interface EquilateralShape { + String EMPTY_ELEMENT = " "; + String EMPTY_STRING = ""; + char NEW_LINE_SYMBOL = '\n'; + + String createShapeString(); + + int getLength(); +} diff --git a/src/com/walking/lesson25_nested_classes/task2/anonymous_class/Main.java b/src/com/walking/lesson25_nested_classes/task2/anonymous_class/Main.java index 5f64539cd..823125ff0 100644 --- a/src/com/walking/lesson25_nested_classes/task2/anonymous_class/Main.java +++ b/src/com/walking/lesson25_nested_classes/task2/anonymous_class/Main.java @@ -1,11 +1,42 @@ package com.walking.lesson25_nested_classes.task2.anonymous_class; +import com.walking.lesson25_nested_classes.task2.anonymous_class.model.Animal; + /** * Реализуйте задачу * ... * используя анонимные классы. */ + public class Main { public static void main(String[] args) { + + Animal[] animals = new Animal[] { new Animal() { + + @Override + public void sound() { + System.out.println("meow"); + } + }, new Animal() { + + @Override + public void sound() { + System.out.println("moo"); + } + }, new Animal() { + + @Override + public void sound() { + System.out.println("woof"); + } + }}; + + soundAll(animals); + } + + private static void soundAll(Animal[] animals) { + for (Animal x : animals) { + x.sound(); + } } } diff --git a/src/com/walking/lesson25_nested_classes/task2/anonymous_class/model/Animal.java b/src/com/walking/lesson25_nested_classes/task2/anonymous_class/model/Animal.java new file mode 100644 index 000000000..052a594b1 --- /dev/null +++ b/src/com/walking/lesson25_nested_classes/task2/anonymous_class/model/Animal.java @@ -0,0 +1,8 @@ +package com.walking.lesson25_nested_classes.task2.anonymous_class.model; + +public class Animal { + + public void sound() { + System.out.println("Unknown animal"); + } +} diff --git a/src/com/walking/lesson25_nested_classes/task2/inner_class/Main.java b/src/com/walking/lesson25_nested_classes/task2/inner_class/Main.java index 9302836d5..7930397e9 100644 --- a/src/com/walking/lesson25_nested_classes/task2/inner_class/Main.java +++ b/src/com/walking/lesson25_nested_classes/task2/inner_class/Main.java @@ -1,5 +1,7 @@ package com.walking.lesson25_nested_classes.task2.inner_class; +import com.walking.lesson25_nested_classes.task2.inner_class.model.Animal; + /** * Реализуйте задачу * ... @@ -7,5 +9,38 @@ */ public class Main { public static void main(String[] args) { + + Main main = new Main(); + Animal[] animals = new Animal[]{main.new Cat(), main.new Cow(), main.new Dog()}; + + soundAll(animals); + } + + private static void soundAll(Animal[] animals) { + for (Animal x : animals) { + x.sound(); + } + } + + + private class Cat extends Animal{ + @Override + public void sound() { + System.out.println("Meow"); + } + } + + private class Dog extends Animal { + @Override + public void sound() { + System.out.println("Woof"); + } + } + + private class Cow extends Animal { + @Override + public void sound() { + System.out.println("Moo"); + } } } diff --git a/src/com/walking/lesson25_nested_classes/task2/inner_class/model/Animal.java b/src/com/walking/lesson25_nested_classes/task2/inner_class/model/Animal.java new file mode 100644 index 000000000..b42270dd8 --- /dev/null +++ b/src/com/walking/lesson25_nested_classes/task2/inner_class/model/Animal.java @@ -0,0 +1,9 @@ +package com.walking.lesson25_nested_classes.task2.inner_class.model; + +public class Animal { + + public void sound() { + System.out.println("Unknown animal"); + } + +} diff --git a/src/com/walking/lesson25_nested_classes/task2/static_class/Main.java b/src/com/walking/lesson25_nested_classes/task2/static_class/Main.java index 39de8becd..028ed8279 100644 --- a/src/com/walking/lesson25_nested_classes/task2/static_class/Main.java +++ b/src/com/walking/lesson25_nested_classes/task2/static_class/Main.java @@ -1,5 +1,7 @@ package com.walking.lesson25_nested_classes.task2.static_class; +import com.walking.lesson25_nested_classes.task2.static_class.model.Animal; + /** * Реализуйте задачу * ... @@ -7,5 +9,35 @@ */ public class Main { public static void main(String[] args) { + Animal[] animals = new Animal[]{new Cat(), new Cow(), new Dog()}; + + soundAll(animals); + } + + private static void soundAll(Animal[] animals) { + for (Animal x : animals) { + x.sound(); + } + } + + private static class Cat extends Animal { + @Override + public void sound() { + System.out.println("meow"); + } + } + + private static class Dog extends Animal { + @Override + public void sound() { + System.out.println("woof"); + } + } + + private static class Cow extends Animal { + @Override + public void sound() { + System.out.println("moo"); + } } } diff --git a/src/com/walking/lesson25_nested_classes/task2/static_class/model/Animal.java b/src/com/walking/lesson25_nested_classes/task2/static_class/model/Animal.java new file mode 100644 index 000000000..321d3d309 --- /dev/null +++ b/src/com/walking/lesson25_nested_classes/task2/static_class/model/Animal.java @@ -0,0 +1,8 @@ +package com.walking.lesson25_nested_classes.task2.static_class.model; + +public class Animal { + + public void sound() { + System.out.println("Unknown animal"); + } +} diff --git a/src/com/walking/lesson26_string_types/task1/Main.java b/src/com/walking/lesson26_string_types/task1/Main.java index 42e1afdbf..eeb1975e5 100644 --- a/src/com/walking/lesson26_string_types/task1/Main.java +++ b/src/com/walking/lesson26_string_types/task1/Main.java @@ -1,11 +1,70 @@ package com.walking.lesson26_string_types.task1; +import java.util.Scanner; + /** * Реализуйте задачу * ... * используя StringBuilder или StringBuffer. Объясните свой выбор. */ + public class Main { public static void main(String[] args) { + Scanner scanner = new Scanner(System.in); + + int length = requireInt(scanner, "Enter rectangle's length: "); + int width = requireInt(scanner, "Enter rectangle's width: "); + + scanner.close(); + + StringBuilder rectangle = printRectangle(length, width); + System.out.println("StringBuilder выбран по причине отсутствия многопоточности"); + System.out.println(rectangle); + } + + private static int requireInt(Scanner scanner, String requiringMessage) { + System.out.print(requiringMessage); + + return scanner.nextInt(); + } + + private static StringBuilder printRectangle(int length, int width) { + return createHorizontalLine(length) + .append(createVerticalLines(length, width)) + .append(createHorizontalLine(length)); + } + + private static StringBuilder createHorizontalLine(int length) { + StringBuilder horizontalLine = new StringBuilder(" "); + + for (int i = 0; i < length; i++) { + horizontalLine = horizontalLine.append("-"); + } + + horizontalLine = horizontalLine.append(" \n"); + + return horizontalLine; + } + + private static StringBuilder createVerticalLines(int length, int width) { + StringBuilder verticalLinesUnit = new StringBuilder(getVerticalLinesUnit(length)); + + StringBuilder verticalLines = new StringBuilder(""); + + for (int i = 0; i < width; i++) { + verticalLines = verticalLines.append(verticalLinesUnit); + } + return verticalLines; + } + + static StringBuilder getVerticalLinesUnit(int length) { + StringBuilder verticalLinesUnit = new StringBuilder("|"); + + for (int i = 0; i < length; i++) { + verticalLinesUnit = verticalLinesUnit.append(" "); + } + + verticalLinesUnit = verticalLinesUnit.append( "|\n"); + return verticalLinesUnit; } } diff --git a/src/com/walking/lesson26_string_types/task2/Main.java b/src/com/walking/lesson26_string_types/task2/Main.java index 7f272e617..ddc47e983 100644 --- a/src/com/walking/lesson26_string_types/task2/Main.java +++ b/src/com/walking/lesson26_string_types/task2/Main.java @@ -1,5 +1,7 @@ package com.walking.lesson26_string_types.task2; +import java.util.Scanner; + /** * Реализуйте программу, принимающую с клавиатуры строку, * содержащую слова, разделенные пробелом. @@ -18,5 +20,41 @@ */ public class Main { public static void main(String[] args) { + Scanner scanner = new Scanner(System.in); + + System.out.print("Enter a words: "); + String[] array = scanner.nextLine() + .trim() + .toLowerCase() + .split(" "); + + scanner.close(); + + System.out.println(getWordsCounter(array)); + } + + private static String getWordsCounter(String[] array) { + int wordsCounter = 0; + + for (int i = 0; i < array.length; i++) { + if (isUnique(array, i)) { + wordsCounter++; + } + } + + return "Found " + wordsCounter + " unique words"; + } + + private static boolean isUnique(String[] array, int i) { + int j = 0; + while (j < i) { + if (array[i].equals(array[j])) { + return false; + } + + j++; + } + + return true; } } diff --git a/src/com/walking/lesson28_generics1/task1/Main.java b/src/com/walking/lesson28_generics1/task1/Main.java index 0455c9bea..680250435 100644 --- a/src/com/walking/lesson28_generics1/task1/Main.java +++ b/src/com/walking/lesson28_generics1/task1/Main.java @@ -1,5 +1,7 @@ package com.walking.lesson28_generics1.task1; +import com.walking.lesson28_generics1.task1.math.Power; + /** * Создать обобщенный тип, принимающий в себя любого из наследников Number. * Создать метод, возводящий значение параметризованного типа в степень, @@ -7,5 +9,13 @@ */ public class Main { public static void main(String[] args) { + Power bytePower = new Power<>((byte) 2); + Power shortPower = new Power<>((short) 2); + Power integerPower = new Power<>(2); + Power longPower = new Power<>((long) 2); + Power floatPower = new Power<>(2.5f); + Power doublePower = new Power<>(2.5); + + System.out.println(doublePower.toPow(3)); } -} +} \ No newline at end of file diff --git a/src/com/walking/lesson28_generics1/task1/math/Power.java b/src/com/walking/lesson28_generics1/task1/math/Power.java new file mode 100644 index 000000000..4afbed7eb --- /dev/null +++ b/src/com/walking/lesson28_generics1/task1/math/Power.java @@ -0,0 +1,18 @@ +package com.walking.lesson28_generics1.task1.math; + +public class Power { + private T base; + + public Power(T base) { + this.base = base; + } + + public double toPow(int exponent) { + double baseD = base.doubleValue(); + return Math.pow(baseD, exponent); + } + + public T getBase() { + return base; + } +} diff --git a/src/com/walking/lesson28_generics1/task2/Main.java b/src/com/walking/lesson28_generics1/task2/Main.java index 7f16bed5e..3089fd84d 100644 --- a/src/com/walking/lesson28_generics1/task2/Main.java +++ b/src/com/walking/lesson28_generics1/task2/Main.java @@ -1,10 +1,19 @@ package com.walking.lesson28_generics1.task2; +import com.walking.lesson28_generics1.task2.model.NotNullObject; + /** * Создать класс-обертку над объектом любого типа. * Предусмотреть boolean-метод, проверяющий значение объекта на null. */ public class Main { public static void main(String[] args) { + + NotNullObject notNullObject = new NotNullObject<>(new Object()); + System.out.println(notNullObject.isNull()); + + NotNullObject nullObject = new NotNullObject<>(null); + System.out.println(nullObject.isNull()); + } } diff --git a/src/com/walking/lesson28_generics1/task2/model/NotNullObject.java b/src/com/walking/lesson28_generics1/task2/model/NotNullObject.java new file mode 100644 index 000000000..bdee39e3e --- /dev/null +++ b/src/com/walking/lesson28_generics1/task2/model/NotNullObject.java @@ -0,0 +1,17 @@ +package com.walking.lesson28_generics1.task2.model; + +public class NotNullObject { + private final T object; + + public NotNullObject(T object) { + this.object = object; + } + + public boolean isNull() { + return object == null; + } + + public T getObject() { + return object; + } +} diff --git a/src/com/walking/lesson28_generics1/task3/Main.java b/src/com/walking/lesson28_generics1/task3/Main.java index 0fb329432..5022c71f6 100644 --- a/src/com/walking/lesson28_generics1/task3/Main.java +++ b/src/com/walking/lesson28_generics1/task3/Main.java @@ -1,5 +1,7 @@ package com.walking.lesson28_generics1.task3; +import com.walking.lesson28_generics1.task3.service.ValueSearcher; + /** * Реализовать класс для работы с массивом. * Разработать метод, производящий поиск значения в массиве. @@ -8,5 +10,13 @@ */ public class Main { public static void main(String[] args) { + + Integer[] integers = new Integer[]{1, 2, 3, 4, 5, 6, 7}; + ValueSearcher integerValueSearcher = new ValueSearcher<>(integers); + + int found = integerValueSearcher.search(4); + System.out.println(found); + + System.out.println(integerValueSearcher.search(8)); } } diff --git a/src/com/walking/lesson28_generics1/task3/exception/ValueNotFoundException.java b/src/com/walking/lesson28_generics1/task3/exception/ValueNotFoundException.java new file mode 100644 index 000000000..aaa070368 --- /dev/null +++ b/src/com/walking/lesson28_generics1/task3/exception/ValueNotFoundException.java @@ -0,0 +1,7 @@ +package com.walking.lesson28_generics1.task3.exception; + +public class ValueNotFoundException extends RuntimeException { + public ValueNotFoundException() { + super("Required Value is not found"); + } +} diff --git a/src/com/walking/lesson28_generics1/task3/service/ValueSearcher.java b/src/com/walking/lesson28_generics1/task3/service/ValueSearcher.java new file mode 100644 index 000000000..baea726f2 --- /dev/null +++ b/src/com/walking/lesson28_generics1/task3/service/ValueSearcher.java @@ -0,0 +1,21 @@ +package com.walking.lesson28_generics1.task3.service; + +import com.walking.lesson28_generics1.task3.exception.ValueNotFoundException; + +public class ValueSearcher { + private final T[] array; + + public ValueSearcher(T[] array) { + this.array = array; + } + + public T search(T requiredValue) { + for (T arrayValue : array) { + if (arrayValue.equals(requiredValue)) { + return arrayValue; + } + } + + throw new ValueNotFoundException(); + } +} diff --git a/src/com/walking/lesson28_generics1/task4/Main.java b/src/com/walking/lesson28_generics1/task4/Main.java index e32e48394..ebffa35c0 100644 --- a/src/com/walking/lesson28_generics1/task4/Main.java +++ b/src/com/walking/lesson28_generics1/task4/Main.java @@ -16,5 +16,6 @@ */ public class Main { public static void main(String[] args) { + } } diff --git a/src/com/walking/lesson28_generics1/task4/exception/StackElementNotFoundException.java b/src/com/walking/lesson28_generics1/task4/exception/StackElementNotFoundException.java new file mode 100644 index 000000000..3a39e80cb --- /dev/null +++ b/src/com/walking/lesson28_generics1/task4/exception/StackElementNotFoundException.java @@ -0,0 +1,7 @@ +package com.walking.lesson28_generics1.task4.exception; + +public class StackElementNotFoundException extends RuntimeException { + public StackElementNotFoundException() { + super("Element in this stack not found"); + } +} diff --git a/src/com/walking/lesson28_generics1/task4/model/Stack.java b/src/com/walking/lesson28_generics1/task4/model/Stack.java new file mode 100644 index 000000000..94fe3c8a7 --- /dev/null +++ b/src/com/walking/lesson28_generics1/task4/model/Stack.java @@ -0,0 +1,97 @@ +package com.walking.lesson28_generics1.task4.model; + +import com.walking.lesson28_generics1.task4.exception.StackElementNotFoundException; + +import java.util.Objects; + +public class Stack { + private Node top; + private long size; + + public Stack() { + } + + public Stack(T top) { + this.top = new Node<>(top); + size++; + } + + public void add(T element) { + top = new Node<>(element, top); + size++; + } + + public void delete(T element) { + Node temp = top; + + if (Objects.equals(element, top.value)) { + top = top.next; + size--; + + return; + } + + while (temp.next != null) { + if (Objects.equals(element, top.next.value)) { + temp.next = temp.next.next; + size--; + + return; + } + + throw new StackElementNotFoundException(); + } + } + + public T find(T element) { + Node temp = top; + + while (temp != null) { + if (Objects.equals(element, temp.value)) { + return temp.value; + } + + temp = temp.next; + } + + throw new StackElementNotFoundException(); + } + + public String getSize() { + return "Size of stack is " + size; + } + + @Override + public String toString() { + StringBuilder toStringValue = new StringBuilder("["); + Node temp = top; + + while (temp != null) { + toStringValue.append(temp.value); + + if (temp.next != null) { + toStringValue.append(", "); + } + + temp = temp.next; + } + + toStringValue.append("]"); + + return toStringValue.toString(); + } + + private static class Node { + private final T value; + private Node next; + + private Node(T value) { + this.value = value; + } + + private Node(T value, Node next) { + this.value = value; + this.next = next; + } + } +} diff --git a/src/com/walking/lesson29_generics2/task1/Main.java b/src/com/walking/lesson29_generics2/task1/Main.java index 70bf6cf88..75fc665eb 100644 --- a/src/com/walking/lesson29_generics2/task1/Main.java +++ b/src/com/walking/lesson29_generics2/task1/Main.java @@ -1,5 +1,7 @@ package com.walking.lesson29_generics2.task1; +import com.walking.lesson29_generics2.task1.model.Generic; + /** * Реализуйте обобщенный тип, хранящий параметризованное поле. * Также в классе Main реализуйте параметризованый метод, @@ -10,5 +12,18 @@ */ public class Main { public static void main(String[] args) { + Generic notNullObject = new Generic<>(25); + System.out.println(getOrDefault(notNullObject, 240)); + + Generic nullObject = new Generic<>(null); + System.out.println(getOrDefault(nullObject, 240)); + } + + private static T getOrDefault(Generic object, T defaultField) { + if (object == null) { + return defaultField; + } + + return object.getNumber(); } } diff --git a/src/com/walking/lesson29_generics2/task1/model/Generic.java b/src/com/walking/lesson29_generics2/task1/model/Generic.java new file mode 100644 index 000000000..780f7a444 --- /dev/null +++ b/src/com/walking/lesson29_generics2/task1/model/Generic.java @@ -0,0 +1,13 @@ +package com.walking.lesson29_generics2.task1.model; + +public class Generic { + private final T number; + + public Generic(T number) { + this.number = number; + } + + public T getNumber() { + return number; + } +} diff --git a/src/com/walking/lesson29_generics2/task2/Main.java b/src/com/walking/lesson29_generics2/task2/Main.java index 5a81839d8..647cfd663 100644 --- a/src/com/walking/lesson29_generics2/task2/Main.java +++ b/src/com/walking/lesson29_generics2/task2/Main.java @@ -1,12 +1,21 @@ package com.walking.lesson29_generics2.task2; +import com.walking.lesson29_generics2.task2.model.NumberExponentiater; + /** * Используя Задачу 1 из урока Generics. * Часть I, реализуйте в Main метод, принимающий аргументом объект подходящего * для дженерика типа и возвращающий объект дженерика. * Допустима параметризация только с использованием wildcard. */ + public class Main { public static void main(String[] args) { + NumberExponentiater numberExponentiater = createNumberExponentiater(4); + System.out.println(numberExponentiater.getNumber()); + } + + private static NumberExponentiater createNumberExponentiater(Number number) { + return new NumberExponentiater<>(number); } } diff --git a/src/com/walking/lesson29_generics2/task2/model/NumberExponentiater.java b/src/com/walking/lesson29_generics2/task2/model/NumberExponentiater.java new file mode 100644 index 000000000..e1e4884e1 --- /dev/null +++ b/src/com/walking/lesson29_generics2/task2/model/NumberExponentiater.java @@ -0,0 +1,24 @@ +package com.walking.lesson29_generics2.task2.model; + +public class NumberExponentiater { + private final T number; + + public NumberExponentiater(T number) { + this.number = number; + } + + public T getNumber() { + return number; + } + + public double exponentiate(double exponent) { + return Math.pow(number.doubleValue(), exponent); + } + + @Override + public String toString() { + return "exponent{" + + "number=" + number + + '}'; + } +} diff --git a/src/com/walking/lesson30_regex/task1easy/Main.java b/src/com/walking/lesson30_regex/task1easy/Main.java index 6a988bb7e..6176dc9a5 100644 --- a/src/com/walking/lesson30_regex/task1easy/Main.java +++ b/src/com/walking/lesson30_regex/task1easy/Main.java @@ -12,5 +12,16 @@ */ public class Main { public static void main(String[] args) { + String phoneNumber = "+7 (914) 029-00-24"; + + if (isPhoneNumber(phoneNumber)) { + System.out.println("It is a Phone Number!"); + } else { + System.out.println("It is not a Phone Number!"); + } + } + + private static boolean isPhoneNumber(String phoneNumber) { + return phoneNumber.matches("^\\+7\\s\\(\\d{3}\\)\\s\\d{3}-\\d{2}-\\d{2}$"); } } diff --git a/src/com/walking/lesson30_regex/task1hard/Main.java b/src/com/walking/lesson30_regex/task1hard/Main.java index 3480d69c3..a4d10f42e 100644 --- a/src/com/walking/lesson30_regex/task1hard/Main.java +++ b/src/com/walking/lesson30_regex/task1hard/Main.java @@ -15,6 +15,50 @@ * или использования символов-разделителей в другом порядке считаем невалидным) */ public class Main { + + public static final String PHONE_NUMBER_REGEX = "^\\+7\\s?\\(?\\d{3}\\)?\\s?\\d{3}-?\\d{2}-?\\d{2}$"; + public static final String SPACE_REGEX = "^.+\\s.+\\s.+$"; + public static final String HYPHEN_REGEX = "^.+-.+-.+$"; + public static final String BRACKET_REGEX = "^.+\\(.+\\).+$"; + public static void main(String[] args) { + + //Да, я уже посмотрел решение и понял, что я не выполнил условие задачи до конца) + String phoneNumber = "+7 (914) 029-00-24"; + + if (isPhoneNumber(phoneNumber) && isPhoneSpaces(phoneNumber) + && isPhoneHyphen(phoneNumber) && isPhoneBrackets(phoneNumber)) { + System.out.println("It is a Phone Number!"); + } else { + System.out.println("It is not a Phone Number!"); + } + } + + private static boolean isPhoneNumber(String phoneNumber) { + return phoneNumber.matches(PHONE_NUMBER_REGEX); + } + + private static boolean isPhoneSpaces(String phoneNumber) { + if (phoneNumber.contains(" ")) { + return phoneNumber.matches(SPACE_REGEX); + } + + return true; + } + + private static boolean isPhoneHyphen(String phoneNumber) { + if (phoneNumber.contains("-")) { + return phoneNumber.matches(HYPHEN_REGEX); + } + + return true; + } + + private static boolean isPhoneBrackets(String phoneNumber) { + if (phoneNumber.contains("(") || phoneNumber.contains(")")) { + return phoneNumber.matches(BRACKET_REGEX); + } + + return true; } } diff --git a/src/com/walking/lesson30_regex/task2/Main.java b/src/com/walking/lesson30_regex/task2/Main.java index c101f97f4..f558b2dd0 100644 --- a/src/com/walking/lesson30_regex/task2/Main.java +++ b/src/com/walking/lesson30_regex/task2/Main.java @@ -1,5 +1,10 @@ package com.walking.lesson30_regex.task2; +import com.walking.lesson30_regex.task2.exception.ValidationException; +import com.walking.lesson30_regex.task2.information.FullName; + +import java.util.regex.Pattern; + /** * Реализуйте метод для работы с ФИО. * Входным параметром должна являться строка, @@ -13,6 +18,53 @@ * Если невалидна – бросьте из метода исключение, указывающее на ошибку валидации. */ public class Main { + + public static final String SURNAME_WITH_HYPHEN_REGEX = "^[А-Я][а-я]+-[А-Я][а-я]+$"; + public static final String USUAL_NAME_REGEX = "^[А-Я][а-я]+$"; + public static void main(String[] args) { + String someName = "Ниязов Алексей Рустамович"; + System.out.println(getFullName(someName)); + + } + + private static FullName getFullName(String input) { + String[] fullNameArray = input.split(" "); + FullName fullName = new FullName(fullNameArray[1], fullNameArray[0], fullNameArray[2]); + + if (isValidFullName(fullName)) { + return fullName; + } + + throw new ValidationException("Input data is invalid"); + } + + private static boolean isValidFullName(FullName fullName) { + + return isValidSurname(fullName.getSurname()) + && isValidName(fullName.getFirstName()) + && isValidName(fullName.getFathersName()); + } + + private static boolean isValidSurname(String surname) { + if (surname.contains("-") && isValidName(SURNAME_WITH_HYPHEN_REGEX, surname)) { + return true; + } + + return isValidName(surname); + } + + private static boolean isValidName(String regex, String name) { + + return Pattern.compile(regex) + .matcher(name) + .find(); + } + + private static boolean isValidName(String name) { + + return Pattern.compile(USUAL_NAME_REGEX) + .matcher(name) + .find(); } } diff --git a/src/com/walking/lesson30_regex/task2/exception/ValidationException.java b/src/com/walking/lesson30_regex/task2/exception/ValidationException.java new file mode 100644 index 000000000..77ccf31dd --- /dev/null +++ b/src/com/walking/lesson30_regex/task2/exception/ValidationException.java @@ -0,0 +1,7 @@ +package com.walking.lesson30_regex.task2.exception; + +public class ValidationException extends RuntimeException { + public ValidationException(String message) { + super(message); + } +} diff --git a/src/com/walking/lesson30_regex/task2/information/FullName.java b/src/com/walking/lesson30_regex/task2/information/FullName.java new file mode 100644 index 000000000..819a3fbd1 --- /dev/null +++ b/src/com/walking/lesson30_regex/task2/information/FullName.java @@ -0,0 +1,30 @@ +package com.walking.lesson30_regex.task2.information; + +public class FullName { + private final String firstName; + private final String surname; + private final String fathersName; + + public FullName(String firstName, String surname, String fathersName) { + this.firstName = firstName; + this.surname = surname; + this.fathersName = fathersName; + } + + @Override + public String toString() { + return "%s %s %s".formatted(surname, firstName, fathersName); + } + + public String getFirstName() { + return firstName; + } + + public String getSurname() { + return surname; + } + + public String getFathersName() { + return fathersName; + } +} diff --git a/src/com/walking/lesson30_regex/task3/Main.java b/src/com/walking/lesson30_regex/task3/Main.java index 2af6da998..59faafecc 100644 --- a/src/com/walking/lesson30_regex/task3/Main.java +++ b/src/com/walking/lesson30_regex/task3/Main.java @@ -10,8 +10,71 @@ * или несколько дефисов, но не более одного подряд. * При наличии в исходной строке невалидных символов или некорректном использовании допустимых, * должно быть выброшено исключение. + *

+ * Реализуйте программу, принимающую с клавиатуры строку, + * содержащую слова, разделенные пробелом. + * Выведите в консоль количество уникальных слов в строке. + * Учтите, что строка может начинаться с пробела. + *

+ * Пример: + *

+ * Мама мыла раму мама рамы мыла. Пример строки + *

+ * В данном случае будем считать, что уникальных слов 6: мама, мыла, раму, рамы, пример, строки. + *

+ * Для упрощения допустим, что в строке не могут использоваться символы, + * отличные от пробела или русских/английский букв. + * Помните, что слово может быть введено в разных регистрах. */ + +import java.util.Scanner; + public class Main { public static void main(String[] args) { + Scanner scanner = new Scanner(System.in); + + System.out.print("Enter words: "); + String[] words = scanner.nextLine() + .trim() + .toLowerCase() + .split("\\s+|(\\s)+"); + + scanner.close(); + + int counter = 0; + + for (int i = 0; i < words.length; i++) { + // Каждое слово в массиве сравниваем с предыдущими словами того же массива. + // Если слово эквивалентно одному из предыдущих - оно не уникально + int j = 0; + boolean isUnique = true; + + if (words[i].matches("\\w+[^0-9]+")) { + throw new RuntimeException("Have invalid symbol"); + } + + + if (words[i].contains("-")) { + if (!words[i].matches("[^-]+-?[^-]+-?[^-]+")) { + throw new RuntimeException("More than 1 hyphens"); + } + } + + while (j < i && isUnique) { + if (words[i].equals(words[j])) { + isUnique = false; + } else { + j++; + } + } + + System.out.println(words[i]); + if (isUnique) { + counter++; + } + } + + System.out.printf("Found %d unique words", counter); } } + diff --git a/src/com/walking/lesson30_regex/task4/Main.java b/src/com/walking/lesson30_regex/task4/Main.java index 2f66bcdda..29022f3b3 100644 --- a/src/com/walking/lesson30_regex/task4/Main.java +++ b/src/com/walking/lesson30_regex/task4/Main.java @@ -18,3 +18,5 @@ public class Main { public static void main(String[] args) { } } + +//\\.(\\w*) поиск значений всех до пробела. diff --git a/src/com/walking/lesson31_io_streams/Main.java b/src/com/walking/lesson31_io_streams/Main.java index 3d058d910..ba6d0ba0e 100644 --- a/src/com/walking/lesson31_io_streams/Main.java +++ b/src/com/walking/lesson31_io_streams/Main.java @@ -1,9 +1,104 @@ package com.walking.lesson31_io_streams; +import com.walking.lesson31_io_streams.exception.CastingException; + +import java.io.IOException; + /** * Чтение данных с помощью System.in и приведение к примитивным типам или строкам */ public class Main { - public static void main(String[] args) { + public static void main(String[] args) throws IOException { + System.out.println(readByte()); + System.out.println(readShort()); + System.out.println(readInt()); + System.out.println(readLong()); + System.out.println(readDouble()); + System.out.println(readFloat()); + System.out.println(readChar()); + System.out.println(readBoolean()); + System.out.println(readString()); + } + + private static byte readByte() throws IOException { + return Byte.parseByte(readString()); + } + + private static short readShort() throws IOException { + return Short.parseShort(readString()); + } + + private static int readInt() throws IOException { + return Integer.parseInt(readString()); + } + + private static Long readLong() throws IOException { + return Long.parseLong(readString()); + } + + private static double readDouble() throws IOException { + return Double.parseDouble(readString()); + } + + private static float readFloat() throws IOException { + return Float.parseFloat(readString()); + } + + private static char readChar() throws IOException { + String input = readString(); + + if (input.length() == 1) { + return input.charAt(0); + } + + if (input.length() == 2 && input.charAt(1) == '\n') { + return input.charAt(0); + } + +// На самом деле, спорное решение. +// При некорректном вводе будет сформировано исключение для Character, +// хотя метод предназначен для чтения char + throw new CastingException(input, Character.class); + } + + private static boolean readBoolean() throws IOException { + String input = readString(); + + if ("true".equalsIgnoreCase(input)) { + return true; + } + + if ("false".equalsIgnoreCase(input)) { + return false; + } + + throw new CastingException(input, Boolean.class); + } + + // В такой реализации метод будет корректно работать для строк +// (и символов, т.к. readChar() использует readString()), имеющих только коды от 0 до 256, +// поскольку считывание происходит побайтово +// Сюда попадают цифры и буквы латинского алфавита, кириллица - нет. Напомню, что char в Java +// занимает 2 байта + private static String readString() throws IOException { + StringBuilder result = new StringBuilder(); + + char ch; + boolean isInputFinished = false; + + while (!isInputFinished) { + ch = (char) System.in.read(); + + if (ch == '\n') { + isInputFinished = true; + } else { + result.append(ch); + } + } + + return result.toString(); } } + + +// я иупо переписал, ибо вообще не понял задания) \ No newline at end of file diff --git a/src/com/walking/lesson31_io_streams/exception/CastingException.java b/src/com/walking/lesson31_io_streams/exception/CastingException.java new file mode 100644 index 000000000..2b266065a --- /dev/null +++ b/src/com/walking/lesson31_io_streams/exception/CastingException.java @@ -0,0 +1,9 @@ +package com.walking.lesson31_io_streams.exception; + +public class CastingException extends RuntimeException { + // Вместо Class clazz можно использовать строковый параметр, принимающий название типа. +// Class<> использован в ознакомительных целях + public CastingException(String value, Class clazz) { + super("%s cannot be casted to %s".formatted(value, clazz.getSimpleName())); + } +} diff --git a/src/com/walking/lesson32_files_1/task1/Main.java b/src/com/walking/lesson32_files_1/task1/Main.java index 17fafb884..4ed500d24 100644 --- a/src/com/walking/lesson32_files_1/task1/Main.java +++ b/src/com/walking/lesson32_files_1/task1/Main.java @@ -1,11 +1,59 @@ package com.walking.lesson32_files_1.task1; +import com.walking.lesson32_files_1.task1.model.Car; + +import java.io.FileNotFoundException; +import java.io.FileOutputStream; +import java.io.IOException; + /** * Используя класс Car (или создав новый класс для сущности «машина», на ваше усмотрение) из задачи * ... * Реализуйте сохранение массива машин в файл carCatalog.txt */ public class Main { + + public static final String CAR_CATALOG_FILE_PATH = "./resource/files/lesson32_files_1/task1/carCatalog.txt"; + public static void main(String[] args) { + Car[] cars = initCars(); + + writeCarCatalog(cars); + } + + private static void writeCarCatalog(Car[] cars) { + try (FileOutputStream carCatalog = new FileOutputStream(CAR_CATALOG_FILE_PATH, false)) { + for (Car car : cars) { + byte[] bytesCarInformation = parseString(car).getBytes(); + + carCatalog.write(bytesCarInformation); + carCatalog.write("\n".getBytes()); + } + + System.out.println("Record is over"); + } catch (FileNotFoundException e) { + throw new RuntimeException(e); + } catch (IOException e) { + throw new RuntimeException(e); + } + } + + private static Car[] initCars() { + Car car1 = new Car("RR-111-RR", 2015, "yellow"); + Car car2 = new Car("RR-222-RR", 2016, "yellow"); + Car car4 = new Car("RR-444-RR", 2018, "yellow"); + Car car5 = new Car("RR-555-RR", 2018, "yellow"); + Car car6 = new Car("RR-666-RR", 2018, "yellow"); + Car car7 = new Car("RR-777-RR", 2018, "yellow"); + Car car3 = new Car("RR-333-RR", 2017, "yellow"); + Car car8 = new Car("RR-888-RR", 2018, "yellow"); + Car car9 = new Car("RR-999-RR", 2018, "yellow"); + Car car10 = new Car("RR-000-RR", 2018, "yellow"); + + return new Car[]{car1, car2, car3, car4, car5, car6, car7, car8, car9, car10}; + } + + private static String parseString(Car car) { + return "%s;%s;%s".formatted(car.getNumber(), car.getYear(), car.getColor()); } } diff --git a/src/com/walking/lesson32_files_1/task1/model/Car.java b/src/com/walking/lesson32_files_1/task1/model/Car.java new file mode 100644 index 000000000..8986899c2 --- /dev/null +++ b/src/com/walking/lesson32_files_1/task1/model/Car.java @@ -0,0 +1,67 @@ +package com.walking.lesson32_files_1.task1.model; + +import java.util.Objects; + +public class Car { + private final String number; + private final int year; + private String color; + private int hashcode; + + public Car(String number, int year, String color) { + this.number = number; + this.year = year; + this.color = color; + this.hashcode = hashCode(); + } + + public String getNumber() { + return number; + } + + public int getYear() { + return year; + } + + public String getColor() { + return color; + } + + public void setColor(String color) { + this.color = color; + } + + @Override + public boolean equals(Object o) { + if (this == o) { + return true; + } + + if (o == null || !getClass().equals(o.getClass())) { + return false; + } + + Car car = (Car) o; + + return year == car.year && Objects.equals(number, car.number); + } + + @Override + public int hashCode() { + if (hashcode == 0) { + hashcode = number.hashCode(); + hashcode += 31 * year; + } + + return hashcode; + } + + @Override + public String toString() { + return """ + number: %s + year: %d + color: %s + """.formatted(number, year, color); + } +} diff --git a/src/com/walking/lesson32_files_1/task2/Main.java b/src/com/walking/lesson32_files_1/task2/Main.java index b3fb29921..c7f71f659 100644 --- a/src/com/walking/lesson32_files_1/task2/Main.java +++ b/src/com/walking/lesson32_files_1/task2/Main.java @@ -1,10 +1,58 @@ package com.walking.lesson32_files_1.task2; +import com.walking.lesson32_files_1.task1.model.Car; + +import java.io.FileInputStream; +import java.io.IOException; + /** * Используя Задачу 1, реализуйте чтение из carCatalog.txt, * реализовав сохранение данных в массив Car. */ public class Main { + + public static final String CAR_CATALOG_FILE_PATH = "./resource/files/lesson32_files_1/task2/carCatalog.txt"; + public static void main(String[] args) { + String carCatalog = readCarCatalog(CAR_CATALOG_FILE_PATH); + Car[] cars = getCars(carCatalog.split("\n")); + + for (Car car : cars) { + System.out.println(car); + } + } + + + private static String readCarCatalog(String carCatalogPath) { + StringBuilder fileLine = new StringBuilder(); + try (FileInputStream carCatalogueReader = new FileInputStream(carCatalogPath)) { + byte[] b = carCatalogueReader.readAllBytes(); + + for (byte sym : b) { + fileLine.append((char) sym); + } + + } catch (IOException e) { + throw new RuntimeException(e); + } + return fileLine.toString(); + } + + private static Car[] getCars(String[] carCatalogText) { + Car[] cars = new Car[carCatalogText.length]; + + for (int i = 0; i < carCatalogText.length; i++) { + cars[i] = parseCar(carCatalogText[i].split(";")); + } + + return cars; + } + + private static Car parseCar(String[] carInformation) { + String number = carInformation[0]; + int year = Integer.parseInt(carInformation[1]); + String color = carInformation[2]; + + return new Car(number, year, color); } } diff --git a/src/com/walking/lesson32_files_1/task2/model/Car.java b/src/com/walking/lesson32_files_1/task2/model/Car.java new file mode 100644 index 000000000..de373f702 --- /dev/null +++ b/src/com/walking/lesson32_files_1/task2/model/Car.java @@ -0,0 +1,63 @@ +package com.walking.lesson32_files_1.task2.model; + +import java.util.Objects; + +public class Car { + private final String number; + private final int year; + private String color; + private int hashcode; + + public Car(String number, int year, String color) { + this.number = number; + this.year = year; + this.color = color; + this.hashcode = hashCode(); + } + + public String getNumber() { + return number; + } + + public int getYear() { + return year; + } + + public String getColor() { + return color; + } + + public void setColor(String color) { + this.color = color; + } + + @Override + public boolean equals(Object o) { + if (this == o) { + return true; + } + + if (o == null || !getClass().equals(o.getClass())) { + return false; + } + + Car car = (Car) o; + + return year == car.year && Objects.equals(number, car.number); + } + + @Override + public int hashCode() { + if (hashcode == 0) { + hashcode = number.hashCode(); + hashcode += 31 * year; + } + + return hashcode; + } + + @Override + public String toString() { + return "%s;%d;%s\n".formatted(number, year, color); + } +} diff --git a/src/com/walking/lesson32_files_1/task3/Main.java b/src/com/walking/lesson32_files_1/task3/Main.java index 7032b7a4e..aca7a82ce 100644 --- a/src/com/walking/lesson32_files_1/task3/Main.java +++ b/src/com/walking/lesson32_files_1/task3/Main.java @@ -1,5 +1,9 @@ package com.walking.lesson32_files_1.task3; +import com.walking.lesson32_files_1.task3.model.Car; +import com.walking.lesson32_files_1.task3.repository.CarRepository; +import com.walking.lesson32_files_1.task3.service.CarService; + /** * Реализуйте возможность добавления, удаления и изменения информации о машинах, * используя Задачи 1 и 2. @@ -7,6 +11,32 @@ * но вы можете сделать иную реализацию на свое усмотрение. */ public class Main { + public static void main(String[] args) { + Car[] cars = initCars(); + + CarRepository carRepository = new CarRepository(); + carRepository.writeCarCatalog(cars); + + CarService carService = new CarService(carRepository.getCarCatalog()); + carService.add(new Car("EE-111-EE", 2025, "black")); + carService.change(new Car("RR-222-RR", 2016, "pink")); + carService.delete(new Car("RR-333-RR", 2017, "yellow")); + + } + + private static Car[] initCars() { + Car car1 = new Car("RR-111-RR", 2015, "yellow"); + Car car2 = new Car("RR-222-RR", 2016, "yellow"); + Car car4 = new Car("RR-444-RR", 2018, "yellow"); + Car car5 = new Car("RR-555-RR", 2018, "yellow"); + Car car6 = new Car("RR-666-RR", 2018, "yellow"); + Car car7 = new Car("RR-777-RR", 2018, "yellow"); + Car car3 = new Car("RR-333-RR", 2017, "yellow"); + Car car8 = new Car("RR-888-RR", 2018, "yellow"); + Car car9 = new Car("RR-999-RR", 2018, "yellow"); + Car car10 = new Car("RR-000-RR", 2018, "yellow"); + + return new Car[]{car1, car2, car3, car4, car5, car6, car7, car8, car9, car10}; } } diff --git a/src/com/walking/lesson32_files_1/task3/model/Car.java b/src/com/walking/lesson32_files_1/task3/model/Car.java new file mode 100644 index 000000000..82c2d122c --- /dev/null +++ b/src/com/walking/lesson32_files_1/task3/model/Car.java @@ -0,0 +1,63 @@ +package com.walking.lesson32_files_1.task3.model; + +import java.util.Objects; + +public class Car { + private final String number; + private final int year; + private String color; + private int hashcode; + + public Car(String number, int year, String color) { + this.number = number; + this.year = year; + this.color = color; + this.hashcode = hashCode(); + } + + public String getNumber() { + return number; + } + + public int getYear() { + return year; + } + + public String getColor() { + return color; + } + + public void setColor(String color) { + this.color = color; + } + + @Override + public boolean equals(Object o) { + if (this == o) { + return true; + } + + if (o == null || !getClass().equals(o.getClass())) { + return false; + } + + Car car = (Car) o; + + return year == car.year && Objects.equals(number, car.number); + } + + @Override + public int hashCode() { + if (hashcode == 0) { + hashcode = number.hashCode(); + hashcode += 31 * year; + } + + return hashcode; + } + + @Override + public String toString() { + return "%s;%s;%s".formatted(number, year, color); + } +} diff --git a/src/com/walking/lesson32_files_1/task3/repository/CarRepository.java b/src/com/walking/lesson32_files_1/task3/repository/CarRepository.java new file mode 100644 index 000000000..03d1f139f --- /dev/null +++ b/src/com/walking/lesson32_files_1/task3/repository/CarRepository.java @@ -0,0 +1,57 @@ +package com.walking.lesson32_files_1.task3.repository; + +import com.walking.lesson32_files_1.task3.model.Car; + +import java.io.FileInputStream; +import java.io.FileOutputStream; +import java.io.IOException; + +public class CarRepository { + private static final String CAR_CATALOG_FILE_PATH = "./resource/files/lesson32_files_1/task3/carCatalog.txt"; + + public Car[] getCarCatalog() { + String carCatalog = readCarCatalog(); + String[] carsArray = carCatalog.split("\n"); + Car[] cars = new Car[carsArray.length]; + + for (int i = 0; i < cars.length; i++) { + cars[i] = parseCar(carsArray[i]); + } + + return cars.clone(); + } + + public void writeCarCatalog(Car[] cars) { + try (FileOutputStream carCatalog = new FileOutputStream(CAR_CATALOG_FILE_PATH, false)) { + for (Car car : cars) { + byte[] bytesCarInformation = car.toString().getBytes(); + + carCatalog.write(bytesCarInformation); + carCatalog.write("\n".getBytes()); + } + + System.out.println("Recording is over"); + } catch (IOException e) { + e.printStackTrace(); + } + } + + private String readCarCatalog() { + try (FileInputStream fileInputStream = new FileInputStream(CAR_CATALOG_FILE_PATH)) { + return new String(fileInputStream.readAllBytes()); + } catch (IOException e) { + throw new RuntimeException(e); + } + } + + private Car parseCar(String carStr) { + String[] splitCarStr = carStr.split(";"); + + String number = splitCarStr[0].equals("null") ? null : splitCarStr[0]; + int year = Integer.parseInt(splitCarStr[1]); + String color = splitCarStr[2].equals("null") ? null : splitCarStr[2]; + + return new Car(number, year, color); + + } +} diff --git a/src/com/walking/lesson32_files_1/task3/service/CarService.java b/src/com/walking/lesson32_files_1/task3/service/CarService.java new file mode 100644 index 000000000..8bec6a592 --- /dev/null +++ b/src/com/walking/lesson32_files_1/task3/service/CarService.java @@ -0,0 +1,94 @@ +package com.walking.lesson32_files_1.task3.service; + +import com.walking.lesson32_files_1.task3.model.Car; + +import java.util.Arrays; + +public class CarService { + private Car[] cars; + + public CarService(Car[] cars) { + this.cars = cars; + } + + public Car[] getCars() { + return cars.clone(); + } + + public Car change(Car car) { + Car existedCar = find(car); + + if (existedCar == null) { + throw new RuntimeException( + "Non-existent car cannot be updated. Number: %s, year: %d".formatted(car.getNumber(), car.getYear())); + } + + existedCar.setColor(car.getColor()); + + return existedCar; + } + + public Car add(Car newCar) { + Car existedCar = find(newCar); + + if (existedCar == null) { + System.out.println("Car already exists"); + + return existedCar; + } + + cars = Arrays.copyOf(cars, cars.length + 1); + cars[cars.length - 1] = newCar; + + return newCar; + } + + public void delete(Car car) { + Integer index = findCarIndex(car); + + if (index == null) { + System.out.println("Car is not exist"); + return; + } + + if (index == cars.length - 1) { + cars = Arrays.copyOf(cars, cars.length - 1); + return; + } + + Car[] newCars = new Car[cars.length - 1]; + + int i = 0; + int j = 0; + while (i < newCars.length) { + if (i != index) { + newCars[j] = cars[i]; + j++; + } + + i++; + } + + cars = newCars; + } + + private Car find(Car car) { + for (Car c : cars) { + if (c.hashCode() == car.hashCode() && c.equals(car)) { + return c; + } + } + + return null; + } + + private Integer findCarIndex(Car car) { + for (int i = 0; i < cars.length; i++) { + if (cars[i].hashCode() == car.hashCode() && cars[i].equals(car)) { + return i; + } + } + + return null; + } +} diff --git a/src/com/walking/lesson33_files_2/model/Car.java b/src/com/walking/lesson33_files_2/model/Car.java new file mode 100644 index 000000000..5a761adf6 --- /dev/null +++ b/src/com/walking/lesson33_files_2/model/Car.java @@ -0,0 +1,88 @@ +package com.walking.lesson33_files_2.model; + +import java.util.Objects; + +public class Car { + private final String number; + private final int year; + + private String color; + private boolean actualTechnicalInspection; + + private int hashcode; + + public Car(String number, int year, String color) { + this(number, year, color, false); + } + + public Car(String number, int year, String color, boolean actualTechnicalInspection) { + this.number = number; + this.year = year; + this.color = color; + this.actualTechnicalInspection = actualTechnicalInspection; + + this.hashcode = hashCode(); + } + + public String getNumber() { + return number; + } + + public int getYear() { + return year; + } + + public String getColor() { + return color; + } + + public boolean isActualTechnicalInspection() { + return actualTechnicalInspection; + } + + public void setColor(String color) { + this.color = color; + } + + public void setActualTechnicalInspection(boolean actualTechnicalInspection) { + this.actualTechnicalInspection = actualTechnicalInspection; + } + + @Override + public boolean equals(Object o) { + if (this == o) { + return true; + } + + if (o == null || !getClass().equals(o.getClass())) { + return false; + } + + Car car = (Car) o; + + return year == car.year && Objects.equals(number, car.number); + } + + @Override + public int hashCode() { + if (hashcode == 0) { + hashcode = number.hashCode(); + hashcode += 31 * year; + } + + return hashcode; + } + + @Override + public String toString() { + return """ + + number: %s + year: %d + color: %s + actualTechnicalInspection: %s + """.formatted( + number, year, color, + actualTechnicalInspection ? "actual" : "not actual"); + } +} diff --git a/src/com/walking/lesson33_files_2/task1/var1/Main.java b/src/com/walking/lesson33_files_2/task1/var1/Main.java new file mode 100644 index 000000000..68456219d --- /dev/null +++ b/src/com/walking/lesson33_files_2/task1/var1/Main.java @@ -0,0 +1,70 @@ +package com.walking.lesson33_files_2.task1.var1; + +import com.walking.lesson33_files_2.model.Car; + +import java.io.File; +import java.io.FileWriter; +import java.io.IOException; + +/** + * Реализуйте Задачу 1 из урока + * ... + * с помощью: + *

+ * Вариант 1: FileWriter; + */ + +public class Main { + public static final String CAR_CATALOG_FILE_PATH = "./resource/files/lesson33_files_2/task1/var1/carCatalog.txt"; + + public static void main(String[] args) { + File file = new File(CAR_CATALOG_FILE_PATH); + Car[] cars = initCars(); + try { + if (file.createNewFile()) { + writeCarCatalog(file, cars); + } + } catch (IOException e) { + throw new RuntimeException(e); + } + } + + private static void writeCarCatalog(File carCatalogFile, Car[] cars) { + + try (FileWriter writer = new FileWriter(carCatalogFile)) { + if (carCatalogFile.isFile()) { + System.out.println("Record started"); + StringBuilder carCatalogText = new StringBuilder(); + + for (Car car : cars) { + carCatalogText.append(parseString(car)); + carCatalogText.append('\n'); + } + + writer.write(carCatalogText.toString()); + System.out.println("Record completed"); + } + } catch (IOException e) { + throw new RuntimeException(e); + } + } + + private static Car[] initCars() { + Car car1 = new Car("RR-111-RR", 2015, "yellow"); + Car car2 = new Car("RR-222-RR", 2016, "yellow"); + Car car4 = new Car("RR-444-RR", 2018, "yellow"); + Car car5 = new Car("RR-555-RR", 2018, "yellow"); + Car car6 = new Car("RR-666-RR", 2018, "yellow"); + Car car7 = new Car("RR-777-RR", 2018, "yellow"); + Car car3 = new Car("RR-333-RR", 2017, "yellow"); + Car car8 = new Car("RR-888-RR", 2018, "yellow"); + Car car9 = new Car("RR-999-RR", 2018, "yellow"); + Car car10 = new Car("RR-000-RR", 2018, "yellow"); + + return new Car[]{car1, car2, car3, car4, car5, car6, car7, car8, car9, car10}; + } + + private static String parseString(Car car) { + return "%s;%s;%s".formatted(car.getNumber(), car.getYear(), car.getColor()); + } +} diff --git a/src/com/walking/lesson33_files_2/task1/var2/Main.java b/src/com/walking/lesson33_files_2/task1/var2/Main.java new file mode 100644 index 000000000..1d42f20a7 --- /dev/null +++ b/src/com/walking/lesson33_files_2/task1/var2/Main.java @@ -0,0 +1,62 @@ +package com.walking.lesson33_files_2.task1.var2; + +import com.walking.lesson33_files_2.model.Car; + +import java.io.*; + +/** + * Реализуйте Задачу 1 из урока + * ... + * с помощью: + *

+ * Вариант 2: BufferedOutputStream; + */ + +public class Main { + public static final String CAR_CATALOG_FILE_PATH = "./resource/files/lesson33_files_2/task1/var2/carCatalog.txt"; + + public static void main(String[] args) { + Car[] cars = initCars(); + + writeCarCatalog(cars); + } + + private static void writeCarCatalog(Car[] cars) { + File carCatalog = new File(CAR_CATALOG_FILE_PATH); + System.out.println("record is beginning"); + + try (FileOutputStream fileOutputStream = new FileOutputStream(carCatalog, true); + BufferedOutputStream bufferedOutputStream = new BufferedOutputStream(fileOutputStream)) { + + for (Car car : cars) { + byte[] carBytes = parseString(car).getBytes(); + + bufferedOutputStream.write(carBytes); + bufferedOutputStream.write('\n'); + } + System.out.println("record is over"); + + } catch (IOException e) { + throw new RuntimeException(e); + } + } + + private static Car[] initCars() { + Car car1 = new Car("RR-111-RR", 2015, "yellow"); + Car car2 = new Car("RR-222-RR", 2016, "yellow"); + Car car4 = new Car("RR-444-RR", 2018, "yellow"); + Car car5 = new Car("RR-555-RR", 2018, "yellow"); + Car car6 = new Car("RR-666-RR", 2018, "yellow"); + Car car7 = new Car("RR-777-RR", 2018, "yellow"); + Car car3 = new Car("RR-333-RR", 2017, "yellow"); + Car car8 = new Car("RR-888-RR", 2018, "yellow"); + Car car9 = new Car("RR-999-RR", 2018, "yellow"); + Car car10 = new Car("RR-000-RR", 2018, "yellow"); + + return new Car[]{car1, car2, car3, car4, car5, car6, car7, car8, car9, car10}; + } + + private static String parseString(Car car) { + return "%s;%s;%s".formatted(car.getNumber(), car.getYear(), car.getColor()); + } +} \ No newline at end of file diff --git a/src/com/walking/lesson33_files_2/task1/var3/Main.java b/src/com/walking/lesson33_files_2/task1/var3/Main.java new file mode 100644 index 000000000..21b75313b --- /dev/null +++ b/src/com/walking/lesson33_files_2/task1/var3/Main.java @@ -0,0 +1,58 @@ +package com.walking.lesson33_files_2.task1.var3; + +import com.walking.lesson33_files_2.model.Car; + +import java.io.BufferedWriter; +import java.io.FileWriter; +import java.io.IOException; + +/** + * Реализуйте Задачу 1 из урока + * ... + * с помощью: + *

+ * Вариант 3: BufferedWriter. + */ +public class Main { + public static final String CAR_CATALOG_FILE_PATH = "./resource/files/lesson33_files_2/task1/var3/carCatalog.txt"; + + public static void main(String[] args) { +// Car[] cars = initCars(); + +// writeCarCatalog(cars); + } + + private static void writeCarCatalog(Car[] cars) { + System.out.println("Record is beginning"); + + try (BufferedWriter bufferedWriter = new BufferedWriter(new FileWriter(CAR_CATALOG_FILE_PATH))) { + for (Car car : cars) { + bufferedWriter.write(parseString(car)); + bufferedWriter.write('\n'); + } + + System.out.println("Record is over"); + } catch (IOException e) { + throw new RuntimeException(e); + } + } + +// private static Car[] initCars() { +// Car car1 = new Car("RR-111-RR", 2015, "yellow"); +// Car car2 = new Car("RR-222-RR", 2016, "yellow"); +// Car car4 = new Car("RR-444-RR", 2018, "yellow"); +// Car car5 = new Car("RR-555-RR", 2018, "yellow"); +// Car car6 = new Car("RR-666-RR", 2018, "yellow"); +// Car car7 = new Car("RR-777-RR", 2018, "yellow"); +// Car car3 = new Car("RR-333-RR", 2017, "yellow"); +// Car car8 = new Car("RR-888-RR", 2018, "yellow"); +// Car car9 = new Car("RR-999-RR", 2018, "yellow"); +// Car car10 = new Car("RR-000-RR", 2018, "yellow"); +// +// return new Car[]{car1, car2, car3, car4, car5, car6, car7, car8, car9, car10}; +// } + + private static String parseString(Car car) { + return "%s;%s;%s".formatted(car.getNumber(), car.getYear(), car.getColor()); + } +} diff --git a/src/com/walking/lesson33_files_2/task2/var1/Main.java b/src/com/walking/lesson33_files_2/task2/var1/Main.java new file mode 100644 index 000000000..474ddfcd8 --- /dev/null +++ b/src/com/walking/lesson33_files_2/task2/var1/Main.java @@ -0,0 +1,65 @@ +package com.walking.lesson33_files_2.task2.var1; + +import com.walking.lesson33_files_2.model.Car; + +import java.io.File; +import java.io.FileNotFoundException; +import java.io.FileReader; +import java.io.IOException; + +/** + * Реализуйте Задачу 2 из урока + * ... + * с помощью: + *

+ * Вариант 1: FileReader; + */ + +public class Main { + public static final String CAR_CATALOG_FILE_PATH = "./resource/files/lesson33_files_2/task2/var1/carCatalog.txt"; + + public static void main(String[] args) { + File carCatalogFile = new File(CAR_CATALOG_FILE_PATH); + String carCatalogText = readCarCatalog(carCatalogFile); + Car[] cars = getCars(carCatalogText.split("\n")); + + for (Car car : cars) { + System.out.println(car); + } + } + + private static String readCarCatalog(File carCatalogFile) { + StringBuilder carCatalogText = new StringBuilder(); + if (carCatalogFile.isFile()) { + int i; + try (FileReader reader = new FileReader(carCatalogFile)) { + while ((i = reader.read()) != -1) { + carCatalogText.append((char) i); + } + } catch (FileNotFoundException e) { + throw new RuntimeException(e); + } catch (IOException e) { + throw new RuntimeException(e); + } + } + + return carCatalogText.toString(); + } + + private static Car[] getCars(String[] catCatalogText) { + Car[] cars = new Car[catCatalogText.length]; + + for (int i = 0; i < catCatalogText.length; i++) { + cars[i] = parseCar(catCatalogText[i].split(";")); + } + + return cars; + } + + private static Car parseCar(String[] carText) { + String number = carText[0]; + int year = Integer.parseInt(carText[1]); + String color = carText[2]; + return new Car(number, year, color); + } +} diff --git a/src/com/walking/lesson33_files_2/task2/var2/Main.java b/src/com/walking/lesson33_files_2/task2/var2/Main.java new file mode 100644 index 000000000..5ff8e1821 --- /dev/null +++ b/src/com/walking/lesson33_files_2/task2/var2/Main.java @@ -0,0 +1,66 @@ +package com.walking.lesson33_files_2.task2.var2; + +import com.walking.lesson33_files_2.model.Car; + +import java.io.*; + +/** + * Реализуйте Задачу 2 из урока + * ... + * с помощью: + *

+ * Вариант 2: BufferedInputStream; + */ +public class Main { + public static final String CAR_CATALOG_FILE_PATH = "./resource/files/lesson33_files_2/task2/var2/carCatalog.txt"; + + public static void main(String[] args) { + File carCatalogFile = new File(CAR_CATALOG_FILE_PATH); + String carCatalogText = readCarCatalog(carCatalogFile); + Car[] cars = getCars(carCatalogText.split("\n")); + + for (Car car : cars) { + System.out.println(car); + } + } + + private static String readCarCatalog(File carCatalogFile) { + StringBuilder carCatalogText = new StringBuilder(); + + if (carCatalogFile.isFile()) { + try (FileInputStream fileInputStream = new FileInputStream(carCatalogFile); + BufferedInputStream bufferedInputStream = new BufferedInputStream(fileInputStream)) { + byte[] byteCarCatalog = bufferedInputStream.readAllBytes(); + + for (byte b : byteCarCatalog) { + carCatalogText.append((char) b); + } + + } catch (FileNotFoundException e) { + throw new RuntimeException(e); + } catch (IOException e) { + throw new RuntimeException(e); + } + } + + return carCatalogText.toString(); + } + + private static Car[] getCars(String[] carCatalogText) { + Car[] cars = new Car[carCatalogText.length]; + + for (int i = 0; i < carCatalogText.length; i++) { + cars[i] = parseCar(carCatalogText[i].split(";")); + } + + return cars; + } + + private static Car parseCar(String[] carInformation) { + String number = carInformation[0]; + int year = Integer.parseInt(carInformation[1]); + String color = carInformation[2]; + + return new Car(number, year, color); + } +} diff --git a/src/com/walking/lesson33_files_2/task2/var3/Main.java b/src/com/walking/lesson33_files_2/task2/var3/Main.java new file mode 100644 index 000000000..8fd468b0e --- /dev/null +++ b/src/com/walking/lesson33_files_2/task2/var3/Main.java @@ -0,0 +1,58 @@ +package com.walking.lesson33_files_2.task2.var3; + +import com.walking.lesson33_files_2.model.Car; + +import java.io.*; + +public class Main { + public static final String CAR_CATALOG_FILE_PATH = "./resource/files/lesson33_files_2/task2/var3/carCatalog.txt"; + + public static void main(String[] args) { + File carCatalogFile = new File(CAR_CATALOG_FILE_PATH); + String carCatalogText = readCarCatalog(carCatalogFile); + Car[] cars = getCars(carCatalogText.split("\n")); + + for (Car car : cars) { + System.out.println(car); + } + } + + private static Car[] getCars(String[] carCatalogText) { + Car[] cars = new Car[carCatalogText.length]; + + for (int i = 0; i < carCatalogText.length; i++) { + cars[i] = parseCar(carCatalogText[i].split(";")); + } + + return cars; + } + + private static String readCarCatalog(File carCatalogFile) { + StringBuilder carCatalogText = new StringBuilder(); + + if (carCatalogFile.isFile()) { + try (BufferedReader bufferedReader = new BufferedReader(new FileReader(carCatalogFile))) { + String s; + while ((s = bufferedReader.readLine()) != null) { + carCatalogText.append(s); + carCatalogText.append("\n"); + + } + } catch (FileNotFoundException e) { + throw new RuntimeException(e); + } catch (IOException e) { + throw new RuntimeException(e); + } + } + + return carCatalogText.toString(); + } + + private static Car parseCar(String[] carInformation) { + String number = carInformation[0]; + int year = Integer.parseInt(carInformation[1]); + String color = carInformation[2]; + + return new Car(number, year, color, true); + } +} diff --git a/src/com/walking/lesson34_date_time/task1/Main.java b/src/com/walking/lesson34_date_time/task1/Main.java index 9e156d996..1cb60d0a8 100644 --- a/src/com/walking/lesson34_date_time/task1/Main.java +++ b/src/com/walking/lesson34_date_time/task1/Main.java @@ -1,10 +1,23 @@ package com.walking.lesson34_date_time.task1; +import java.time.LocalDateTime; +import java.time.format.DateTimeFormatter; + /** * Реализуйте метод, возвращающий объект LocalDateTime на основании переданной строки. * Пример входящей строки: 20.12.2022 20:16:00. */ public class Main { + + public static final DateTimeFormatter FORMATTER = DateTimeFormatter.ofPattern("dd.MM.yyyy HH:mm:ss"); + public static void main(String[] args) { + String dateTime = "20.12.2022 20:16:00"; + + System.out.println(parseDateTime(dateTime)); + } + + private static LocalDateTime parseDateTime(String dataTime) { + return LocalDateTime.parse(dataTime, FORMATTER); } } diff --git a/src/com/walking/lesson34_date_time/task2/Main.java b/src/com/walking/lesson34_date_time/task2/Main.java index fc6d7351c..93b73c1ef 100644 --- a/src/com/walking/lesson34_date_time/task2/Main.java +++ b/src/com/walking/lesson34_date_time/task2/Main.java @@ -1,10 +1,34 @@ package com.walking.lesson34_date_time.task2; +import java.time.LocalDateTime; +import java.time.format.DateTimeFormatter; +import java.time.temporal.ChronoUnit; +import java.util.Scanner; + /** * Реализуйте программу, выводящую в консоль сообщение, * являются ли введенные с клавиатуры дата и время больше или меньше текущего. */ public class Main { + public static final String FORMATTER_PATTERN = "dd.MM.yyyy HH:mm:ss"; + public static final DateTimeFormatter FORMATTER = DateTimeFormatter.ofPattern(FORMATTER_PATTERN); + public static void main(String[] args) { + Scanner scanner = new Scanner(System.in); + + System.out.println("Enter a datetime: "); + LocalDateTime date = LocalDateTime.parse(scanner.nextLine(), FORMATTER); + + scanner.close(); + + LocalDateTime currentDate = LocalDateTime.now().truncatedTo(ChronoUnit.SECONDS); + + if (date.isBefore(currentDate)) { + System.out.println("date is before now"); + } else if (date.isAfter(currentDate)) { + System.out.println("Date is after now"); + } else { + System.out.println("date are equals"); + } } } diff --git a/src/com/walking/lesson34_date_time/task3/Main.java b/src/com/walking/lesson34_date_time/task3/Main.java index 3dcda11b6..16464c9cc 100644 --- a/src/com/walking/lesson34_date_time/task3/Main.java +++ b/src/com/walking/lesson34_date_time/task3/Main.java @@ -1,10 +1,66 @@ package com.walking.lesson34_date_time.task3; +import java.time.LocalDateTime; +import java.time.ZoneOffset; +import java.time.format.DateTimeFormatter; +import java.util.Scanner; + /** * Реализуйте программу, выводящую в консоль количество времени между двумя * введенными с клавиатуры датами и временем в секундах, минутах, часах, днях, месяцах и годах. */ public class Main { + public static final String FORMATTER_PATTERN = "dd.MM.yyyy HH:mm:ss"; + public static final DateTimeFormatter FORMATTER = DateTimeFormatter.ofPattern(FORMATTER_PATTERN); + public static void main(String[] args) { + Scanner scanner = new Scanner(System.in); + +// System.out.println("Enter a first date: "); +// LocalDateTime firstDate = LocalDateTime.parse(scanner.nextLine(), FORMATTER); +// +// System.out.println("Enter a second date: "); +// LocalDateTime secondDate = LocalDateTime.parse(scanner.nextLine(), FORMATTER); + + LocalDateTime date1 = LocalDateTime.of(2022, 12, 20, 20, 16); + LocalDateTime date2 = LocalDateTime.of(1932, 6, 28, 2, 51, 56); + + scanner.close(); + +// System.out.println(date1.minusSeconds(date2.getSecond()).getSecond()); + + getTimeDifference(date1, date2); + + +// long date1EpochDays = date1.toLocalDate().toEpochDay(); +// System.out.println(date1EpochDays); +// long date2EpochDays = date2.toLocalDate().toEpochDay(); +// System.out.println(date2EpochDays); +// +// long daysDifference = date1EpochDays - date2EpochDays; +// System.out.println(daysDifference); +// +// System.out.println(daysDifference); + } + + private static void getTimeDifference(LocalDateTime date1, LocalDateTime date2) { + long date1EpochSecond = date1.toEpochSecond(ZoneOffset.UTC); + long date2EpochSecond = date2.toEpochSecond(ZoneOffset.UTC); + + long difference = Math.abs(date1EpochSecond - date2EpochSecond); + + System.out.println("Seconds: " + difference); + difference /= 60; + System.out.println("Minutes: " + difference); + difference /= 60; + System.out.println("Hours: " + difference); + difference /= 24; + System.out.println("Days: " + difference); + + long date1EpochDays = date1.toLocalDate().toEpochDay(); + long date2EpochDays = date2.toLocalDate().toEpochDay(); + long daysDifference = Math.abs(date1EpochDays - date2EpochDays); + System.out.println(daysDifference); + } } diff --git a/src/com/walking/lesson37_collection_list/task1/Main.java b/src/com/walking/lesson37_collection_list/task1/Main.java index 4753b4e8f..ac4914e69 100644 --- a/src/com/walking/lesson37_collection_list/task1/Main.java +++ b/src/com/walking/lesson37_collection_list/task1/Main.java @@ -1,5 +1,10 @@ package com.walking.lesson37_collection_list.task1; +import com.walking.lesson37_collection_list.task1.model.Counter; +import com.walking.lesson37_collection_list.task1.service.CounterService; + +import java.util.List; + /** * Реализуйте задачу * ..., используя ArrayList. @@ -10,6 +15,23 @@ * Изменилось ли что-то в кодовой базе при использовании списка другой реализации? */ public class Main { + private static final String HOT_WATER_COUNTER_NAME = "Hot water"; + private static final String COLD_WATER_COUNTER_NAME = "Cold water"; + private static final String ELECTRICITY_COUNTER_NAME = "Electricity"; + + private static final String WATER_UNIT = "m3"; + private static final String ELECTRICITY_UNIT = "kW/h"; + public static void main(String[] args) { + Counter hotWaterCounter = new Counter(HOT_WATER_COUNTER_NAME, WATER_UNIT); + Counter coldWaterCounter = new Counter(COLD_WATER_COUNTER_NAME, WATER_UNIT); + Counter electricityCounter = new Counter(ELECTRICITY_COUNTER_NAME, ELECTRICITY_UNIT, 240); + + CounterService service = new CounterService(List.of(hotWaterCounter, coldWaterCounter)); + service.addCounter(electricityCounter); + System.out.println(service.getCounterByName("Hot water")); + service.reset("Electricity"); + + System.out.println(service.getCounterByName(ELECTRICITY_COUNTER_NAME).getValue()); } } diff --git a/src/com/walking/lesson37_collection_list/task1/model/Counter.java b/src/com/walking/lesson37_collection_list/task1/model/Counter.java new file mode 100644 index 000000000..812f1926f --- /dev/null +++ b/src/com/walking/lesson37_collection_list/task1/model/Counter.java @@ -0,0 +1,61 @@ +package com.walking.lesson37_collection_list.task1.model; + +/** + * Разработать программу в рамках компании com.walking, позволяющую + * следить за счетчиками на газ, холодную воду, горячую воду и электричество. + * Обозначение программы в рамках компании — counterAggregation. + * Используя за основу задачу из темы про классы и объекты (ссылка на + * разбор), реализовать класс счетчика, который хранит название счетчика и его + * значение, его единицы измерения, а также обеспечивает доступ к значениям. + * Название счетчика и его единицы измерения должны быть неизменны. + * Также реализовать сервис CounterService, зона ответственности которого — + * хранение массива доступных счетчиков, получение всех доступных + * счетчиков, получение доступа к счетчику по названию, увеличение значения + * счетчика на единицу или заданное значение, а также сброс счетчика до + * нулевого значения. + * Ответственность класса, содержащего main() — создание счетчиков. Сам + * класс также предлагаю назвать Main. + * Также реализовать в классе Main приватный метод, который позволяет + * вывести значения счетчиков в виде: <Название счетчика>: <Значение + * счетчика>. Например: + * Газ: 2333 + * Горячая вода: 0 + * Холодная вода: 23 + */ +public class Counter { + private final String name; + private final String unit; + + private int value; + + public Counter(String name, String unit) { + this(name, unit, 0); + } + + public Counter(String name, String unit, int value) { + this.name = name; + this.unit = unit; + this.value = value; + } + + public String getName() { + return name; + } + + public String getUnit() { + return unit; + } + + public int getValue() { + return value; + } + + public void setValue(int value) { + this.value = value; + } + + @Override + public String toString() { + return "This counter's name is " + getName(); + } +} diff --git a/src/com/walking/lesson37_collection_list/task1/service/CounterService.java b/src/com/walking/lesson37_collection_list/task1/service/CounterService.java new file mode 100644 index 000000000..ee66cd7b2 --- /dev/null +++ b/src/com/walking/lesson37_collection_list/task1/service/CounterService.java @@ -0,0 +1,73 @@ +package com.walking.lesson37_collection_list.task1.service; + +import com.walking.lesson37_collection_list.task1.model.Counter; + +import java.util.ArrayList; +import java.util.Collection; +import java.util.List; + +/** + * Также реализовать сервис CounterService, зона ответственности которого — + * хранение массива доступных счетчиков, получение всех доступных + * счетчиков, получение доступа к счетчику по названию, увеличение значения + * счетчика на единицу или заданное значение, а также сброс счетчика до + * нулевого значения. + */ +public class CounterService { + private final List counters; + + public CounterService(Collection counters) { + this.counters = new ArrayList<>(counters); + } + + public Counter getCounterByName(String name) { + for (Counter counter : counters) { + if (counter.getName().equals(name)) { + return counter; + } + } + + return null; + } + + public List getCounters() { + return new ArrayList<>(counters); + } + + public boolean addCounter(Counter newCounter) { + return counters.add(newCounter); + } + + public void reset(String name) { + getCounterByName(name).setValue(0); + System.out.println("Counter is reset"); + } + + public void decrease(String name, int value) { + Counter counter = getCounterByName(name); + if (counter == null) { + throw new RuntimeException("This counter is empty"); + } + + counter.setValue(counter.getValue() - value); + System.out.println("Counter's value decreased"); + } + + public void decrement(String name) { + decrease(name, 1); + } + + public void increase(String name, int value) { + Counter counter = getCounterByName(name); + if (counter == null) { + throw new RuntimeException("This counter is empty"); + } + + counter.setValue(counter.getValue() + value); + System.out.println("Counter's value increased"); + } + + public void increment(String name) { + increase(name, 1); + } +} diff --git a/src/com/walking/lesson37_collection_list/task2/Main.java b/src/com/walking/lesson37_collection_list/task2/Main.java index 51a4575bb..0acc7f36c 100644 --- a/src/com/walking/lesson37_collection_list/task2/Main.java +++ b/src/com/walking/lesson37_collection_list/task2/Main.java @@ -1,5 +1,9 @@ package com.walking.lesson37_collection_list.task2; +import com.walking.lesson37_collection_list.task2.collection.Stack; + +import java.util.List; + /** * Попробуйте реализовать собственную коллекцию, наследуясь от Collection. * За основу можно взять @@ -10,5 +14,18 @@ */ public class Main { public static void main(String[] args) { + Stack testStack = new Stack<>(); + testStack.addAll(List.of(1, 2, 3, 4, 5, 6, 7)); + testStack.add(8); + + System.out.println(testStack.contains(4)); + + testStack.remove(3); + + for (Object i : testStack) { + System.out.println(i); + //Не могу понять, почему не могу вывести последный элемент "1" в консоль + //Подсоби, пж + } } } diff --git a/src/com/walking/lesson37_collection_list/task2/collection/Stack.java b/src/com/walking/lesson37_collection_list/task2/collection/Stack.java new file mode 100644 index 000000000..f322ac8db --- /dev/null +++ b/src/com/walking/lesson37_collection_list/task2/collection/Stack.java @@ -0,0 +1,211 @@ +package com.walking.lesson37_collection_list.task2.collection; + +import org.jetbrains.annotations.NotNull; + +import java.util.*; + +public class Stack implements Collection { + private Node top; + private int size; + + public Stack() { + } + + public Stack(T top) { + this.top = new Node<>(top); + size++; + } + + + @Override + public int size() { + return size; + } + + @Override + public boolean isEmpty() { + return size == 0; + } + + @Override + public boolean contains(Object o) { + Node temp = top; + + while (temp != null) { + if (Objects.equals(o, temp.value)) { + return true; + } + + temp = temp.next; + } + + return false; + } + + @Override + public @NotNull Iterator iterator() { + return new StackIterator<>(top); + } + + @Override + public @NotNull Object @NotNull [] toArray() { + Object[] array = new Object[size]; + Node temp = top; + + for (int i = 0; i < size; i++) { + array[i] = temp.value; + temp = temp.next; + } + + return array; + } + + @Override + public @NotNull E @NotNull [] toArray(@NotNull E @NotNull [] a) { + return (E[]) Arrays.copyOf(toArray(), size, a.getClass()); + } + + @Override + public boolean add(T element) { + if (top != null) { + top = new Node<>(element, top); + size++; + + return true; + } + + top = new Node<>(element); + size++; + + return true; + } + + + @Override + public boolean remove(Object o) { + if (Objects.equals(o, top.value)) { + top = top.next; + size--; + } + + Node temp = top; + while (temp.next != null) { + if (Objects.equals(o, temp.next.value)) { + temp.next = temp.next.next; + size++; + + return true; + } + + temp = temp.next; + } + + return false; + } + + @Override + public boolean containsAll(@NotNull Collection c) { + for (Object o : c) { + if (!contains(o)) { + return false; + } + } + + return true; + } + + @Override + public boolean addAll(@NotNull Collection c) { + for (T o : c) { + add(o); + } + + return true; + } + + @Override + public void clear() { + top = null; + size = 0; + } + + @Override + public boolean retainAll(@NotNull Collection c) { + if (!c.contains(top.value)) { + top = top.next; + size--; + } + + Node temp = top; + + for (Object o : c) { + while (temp.next != null) { + if (!c.contains(o)) { + temp.next = temp.next.next; + size--; + } + } + } + + return size > 0; + } + + @Override + public boolean removeAll(@NotNull Collection c) { + boolean result = false; + Node temp = top; + + for (Object o : c) { + if (Objects.equals(o, temp.value)) { + temp = temp.next; + size--; + + result = true; + } + } + + return result; + } + + + private static class Node { + private final T value; + private Node next; + + public Node(T value) { + this.value = value; + next = null; + } + + public Node(T value, Node next) { + this.value = value; + this.next = next; + } + } + + private static class StackIterator implements Iterator { + Node current; + + public StackIterator(Node top) { + current = top; + } + + + @Override + public boolean hasNext() { + return current.next != null; + } + + @Override + public E next() { + if (!hasNext()) { + throw new NoSuchElementException(); + } + + E result = current.value; + current = current.next; + + return result; + } + } +} diff --git a/src/com/walking/lesson38_comparing/task1/Main.java b/src/com/walking/lesson38_comparing/task1/Main.java index 230a6e319..f5bb69d58 100644 --- a/src/com/walking/lesson38_comparing/task1/Main.java +++ b/src/com/walking/lesson38_comparing/task1/Main.java @@ -1,5 +1,13 @@ package com.walking.lesson38_comparing.task1; +import com.walking.lesson38_comparing.task1.comparator.CarColorComparator; +import com.walking.lesson38_comparing.task1.comparator.CarNumberComparator; +import com.walking.lesson38_comparing.task1.comparator.CarYearComparator; +import com.walking.lesson38_comparing.task1.model.Car; + +import java.util.ArrayList; +import java.util.List; + /** * Используя классы-сущности из задачи * ... @@ -13,5 +21,36 @@ */ public class Main { public static void main(String[] args) { + List cars = initCars(); + + CarNumberComparator numberComparator = new CarNumberComparator(); + cars.sort(numberComparator); + + CarColorComparator colorComparator = new CarColorComparator(); + cars.sort(colorComparator); + + CarYearComparator yearComparator = new CarYearComparator(); + cars.sort(yearComparator); + + cars.sort(numberComparator.thenComparing(yearComparator)); + for (Car car : cars) { + System.out.println(car); + } + } + + private static List initCars() { + List cars = new ArrayList<>(); + cars.add(new Car("RR-111-RR", 2015, "yellow", true)); + cars.add(new Car("RR-222-RR", 2016, "yellow", true)); + cars.add(new Car("RR-333-RR", 2017, "black", true)); + cars.add(new Car("RR-444-RR", 2018, "pink", true)); + cars.add(new Car("RR-555-RR", 2018, "green", true)); + cars.add(new Car("RR-666-RR", 2018, "yellow", true)); + cars.add(new Car("RR-777-RR", 2004, "white", true)); + cars.add(new Car("RR-888-RR", 2018, "yellow", true)); + cars.add(new Car("RR-999-RR", 2013, "blue", true)); + cars.add(new Car("RR-000-RR", 2009, "yellow", true)); + + return cars; } } diff --git a/src/com/walking/lesson38_comparing/task1/comparator/CarColorComparator.java b/src/com/walking/lesson38_comparing/task1/comparator/CarColorComparator.java new file mode 100644 index 000000000..67a470dcf --- /dev/null +++ b/src/com/walking/lesson38_comparing/task1/comparator/CarColorComparator.java @@ -0,0 +1,13 @@ +package com.walking.lesson38_comparing.task1.comparator; + +import com.walking.lesson38_comparing.task1.model.Car; + +import java.util.Comparator; + +public class CarColorComparator implements Comparator { + + @Override + public int compare(Car car1, Car car2) { + return car1.getColor().compareTo(car2.getColor()); + } +} diff --git a/src/com/walking/lesson38_comparing/task1/comparator/CarNumberComparator.java b/src/com/walking/lesson38_comparing/task1/comparator/CarNumberComparator.java new file mode 100644 index 000000000..29874ebfb --- /dev/null +++ b/src/com/walking/lesson38_comparing/task1/comparator/CarNumberComparator.java @@ -0,0 +1,12 @@ +package com.walking.lesson38_comparing.task1.comparator; + +import com.walking.lesson38_comparing.task1.model.Car; + +import java.util.Comparator; + +public class CarNumberComparator implements Comparator { + @Override + public int compare(Car car1, Car car2) { + return car1.getIdentifier().getNumber().compareTo(car2.getIdentifier().getNumber()); + } +} diff --git a/src/com/walking/lesson38_comparing/task1/comparator/CarYearComparator.java b/src/com/walking/lesson38_comparing/task1/comparator/CarYearComparator.java new file mode 100644 index 000000000..3b4137207 --- /dev/null +++ b/src/com/walking/lesson38_comparing/task1/comparator/CarYearComparator.java @@ -0,0 +1,12 @@ +package com.walking.lesson38_comparing.task1.comparator; + +import com.walking.lesson38_comparing.task1.model.Car; + +import java.util.Comparator; + +public class CarYearComparator implements Comparator { + @Override + public int compare(Car car1, Car car2) { + return Integer.compare(car1.getIdentifier().getYear(), car2.getIdentifier().getYear()); + } +} diff --git a/src/com/walking/lesson38_comparing/task1/model/Car.java b/src/com/walking/lesson38_comparing/task1/model/Car.java new file mode 100644 index 000000000..403361afd --- /dev/null +++ b/src/com/walking/lesson38_comparing/task1/model/Car.java @@ -0,0 +1,48 @@ +package com.walking.lesson38_comparing.task1.model; + +public class Car { + private final CarIdentifier identifier; + private String color; + private boolean actualTechnicalInspection; + + public Car(String number, int year, String color, boolean actualTechnicalInspection) { + this(new CarIdentifier(number, year), color, actualTechnicalInspection); + } + + public Car(CarIdentifier identifier, String color, boolean actualTechnicalInspection) { + this.identifier = identifier; + this.color = color; + this.actualTechnicalInspection = actualTechnicalInspection; + } + + public CarIdentifier getIdentifier() { + return identifier; + } + + public String getColor() { + return color; + } + + public void setColor(String color) { + this.color = color; + } + + public boolean isActualTechnicalInspection() { + return actualTechnicalInspection; + } + + public void setActualTechnicalInspection(boolean actualTechnicalInspection) { + this.actualTechnicalInspection = actualTechnicalInspection; + } + + @Override + public String toString() { + return """ + number: %s + year: %d + color: %s + actualTechnicalInspection: %s + """.formatted(identifier.getNumber(), identifier.getYear(), color, + actualTechnicalInspection ? "actual" : "not actual"); + } +} diff --git a/src/com/walking/lesson38_comparing/task1/model/CarIdentifier.java b/src/com/walking/lesson38_comparing/task1/model/CarIdentifier.java new file mode 100644 index 000000000..3cbc501d2 --- /dev/null +++ b/src/com/walking/lesson38_comparing/task1/model/CarIdentifier.java @@ -0,0 +1,46 @@ +package com.walking.lesson38_comparing.task1.model; + +import java.util.Objects; + +public final class CarIdentifier { + + private final String number; + private final int year; + + public CarIdentifier(String number, int year) { + this.number = number; + this.year = year; + } + + public String getNumber() { + return number; + } + + public int getYear() { + return year; + } + + @Override + public boolean equals(Object o) { + if (this == o) { + return true; + } + + if (o == null || !getClass().equals(o.getClass())) { + return false; + } + + CarIdentifier identifier = (CarIdentifier) o; + + return year == identifier.year && Objects.equals(number, identifier.number); + } + + @Override + public int hashCode() { + int hashcode = number.hashCode(); + + hashcode += 31 * year; + + return hashcode; + } +} diff --git a/src/com/walking/lesson38_comparing/task2/Main.java b/src/com/walking/lesson38_comparing/task2/Main.java index def3f23b9..9d630b859 100644 --- a/src/com/walking/lesson38_comparing/task2/Main.java +++ b/src/com/walking/lesson38_comparing/task2/Main.java @@ -1,5 +1,11 @@ package com.walking.lesson38_comparing.task2; +import com.walking.lesson38_comparing.task2.model.Car; + +import java.util.ArrayList; +import java.util.Comparator; +import java.util.List; + /** * Используя классы-сущности из задачи * ..., @@ -11,5 +17,26 @@ */ public class Main { public static void main(String[] args) { + List cars = initCars(); + + cars.sort(Comparator.naturalOrder()); + + cars.sort(Comparator.reverseOrder()); + } + + private static List initCars() { + List cars = new ArrayList<>(); + cars.add(new Car("RR-111-RR", 2015, "yellow", true)); + cars.add(new Car("RR-222-RR", 2016, "yellow", true)); + cars.add(new Car("RR-333-RR", 2017, "black", true)); + cars.add(new Car("RR-444-RR", 2018, "pink", true)); + cars.add(new Car("RR-555-RR", 2018, "green", true)); + cars.add(new Car("RR-666-RR", 2018, "yellow", true)); + cars.add(new Car("RR-777-RR", 2004, "white", true)); + cars.add(new Car("RR-888-RR", 2018, "yellow", true)); + cars.add(new Car("RR-999-RR", 2013, "blue", true)); + cars.add(new Car("RR-000-RR", 2009, "yellow", true)); + + return cars; } -} +} \ No newline at end of file diff --git a/src/com/walking/lesson38_comparing/task2/model/Car.java b/src/com/walking/lesson38_comparing/task2/model/Car.java new file mode 100644 index 000000000..4d762b825 --- /dev/null +++ b/src/com/walking/lesson38_comparing/task2/model/Car.java @@ -0,0 +1,55 @@ +package com.walking.lesson38_comparing.task2.model; + +import org.jetbrains.annotations.NotNull; + +public class Car implements Comparable { + private final CarIdentifier identifier; + private String color; + private boolean actualTechnicalInspection; + + public Car(String number, int year, String color, boolean actualTechnicalInspection) { + this(new CarIdentifier(number, year), color, actualTechnicalInspection); + } + + public Car(CarIdentifier identifier, String color, boolean actualTechnicalInspection) { + this.identifier = identifier; + this.color = color; + this.actualTechnicalInspection = actualTechnicalInspection; + } + + public CarIdentifier getIdentifier() { + return identifier; + } + + public String getColor() { + return color; + } + + public void setColor(String color) { + this.color = color; + } + + public boolean isActualTechnicalInspection() { + return actualTechnicalInspection; + } + + public void setActualTechnicalInspection(boolean actualTechnicalInspection) { + this.actualTechnicalInspection = actualTechnicalInspection; + } + + @Override + public String toString() { + return """ + number: %s + year: %d + color: %s + actualTechnicalInspection: %s + """.formatted(identifier.getNumber(), identifier.getYear(), color, + actualTechnicalInspection ? "actual" : "not actual"); + } + + @Override + public int compareTo(@NotNull Car o) { + return identifier.compareTo(o.getIdentifier()); + } +} diff --git a/src/com/walking/lesson38_comparing/task2/model/CarIdentifier.java b/src/com/walking/lesson38_comparing/task2/model/CarIdentifier.java new file mode 100644 index 000000000..eca12563a --- /dev/null +++ b/src/com/walking/lesson38_comparing/task2/model/CarIdentifier.java @@ -0,0 +1,71 @@ +package com.walking.lesson38_comparing.task2.model; + +import org.jetbrains.annotations.NotNull; + +import java.util.Objects; + +public final class CarIdentifier implements Comparable { + + private final String number; + private final int year; + + public CarIdentifier(String number, int year) { + this.number = number; + this.year = year; + } + + public String getNumber() { + return number; + } + + public int getYear() { + return year; + } + + @Override + public boolean equals(Object o) { + if (this == o) { + return true; + } + + if (o == null || !getClass().equals(o.getClass())) { + return false; + } + + CarIdentifier identifier = (CarIdentifier) o; + + return year == identifier.year && Objects.equals(number, identifier.number); + } + + @Override + public int hashCode() { + int hashcode = number.hashCode(); + + hashcode += 31 * year; + + return hashcode; + } + + @Override + public int compareTo(@NotNull CarIdentifier o) { + if (number.compareTo(o.getNumber()) > 0) { + return 1; + } + + if (number.compareTo(o.getNumber()) < 0) { + return -1; + } + + if (number.compareTo(o.getNumber()) == 0) { + if (Integer.compare(year, o.getYear()) > 0) { + return 1; + } + + if (Integer.compare(year, o.getYear()) < 0) { + return -1; + } + } + + return 0; + } +} diff --git a/src/com/walking/lesson39_queue1/collection/DoublyLinkedList.java b/src/com/walking/lesson39_queue1/collection/DoublyLinkedList.java new file mode 100644 index 000000000..a9cb218d8 --- /dev/null +++ b/src/com/walking/lesson39_queue1/collection/DoublyLinkedList.java @@ -0,0 +1,297 @@ +package com.walking.lesson39_queue1.collection; + +import org.jetbrains.annotations.NotNull; + +import java.util.*; + +public class DoublyLinkedList implements Collection { + private Node top; + private Node last; + + private int size; + + public DoublyLinkedList() { + } + + public DoublyLinkedList(E e) { + this.top = new Node<>(e); + last = top; + size++; + } + + public E getTop() { + return top.value; + } + + public E getLast() { + return last.value; + } + + public void reverse() { + if (size <= 1) { + return; + } + + last = top; + + Node current = top; + Node temp = null; + while (current != null) { + temp = current.prev; + current.prev = current.next; + current.next = temp; + current = current.prev; + } + + top = temp.prev; + } + + @Override + public int size() { + return size; + } + + @Override + public boolean isEmpty() { + return size == 0; + } + + @Override + public boolean contains(Object o) { + Node temp = top; + + while (temp != null) { + if (Objects.equals(o, temp.value)) { + return true; + } + + temp = temp.next; + } + + return false; + } + + @Override + public @NotNull Iterator iterator() { + return new DoublyLinkedListIterator<>(top); + } + + @Override + public @NotNull Object @NotNull [] toArray() { + Node temp = top; + Object[] arr = new Object[size]; + + for (int i = 0; i < size; i++) { + arr[i] = temp.value; + temp = temp.next; + } + + return arr; + } + + @Override + public @NotNull T @NotNull [] toArray(@NotNull T @NotNull [] a) { + return (T[]) Arrays.copyOf(toArray(), size, a.getClass()); + } + + @Override + public boolean add(E e) { + return addLast(e); + } + + private boolean addLast(E e) { + Node oldLast = last; + Node newLast = new Node<>(oldLast, e, null); + last = newLast; + + if (oldLast == null) { + top = newLast; + } else { + oldLast.next = newLast; + } + + size++; + + return true; + } + + public boolean addTop(E e) { + Node oldTop = top; + Node newTop = new Node<>(null, e, oldTop); + top = newTop; + + if (oldTop == null) { + last = newTop; + } else { + oldTop.prev = newTop; + } + + size++; + + return true; + } + + @Override + public boolean remove(Object o) { + Node temp = top; + + if (Objects.equals(o, top.value)) { + top = top.next; + size--; + + if (top == null) { + last = null; + } + + return true; + } + + while (temp.next != null) { + if (Objects.equals(o, temp.next.value)) { + temp.next = temp.next.next; + size--; + + if (temp.next == null) { + last = null; + } + + return true; + } + + temp = temp.next; + } + + return false; + } + + public void removeTop() { + if (size == 0) { + return; + } + + top = top.next; + size--; + + if (top == null) { + last = null; + } + } + + public void removeLast() { + if (size == 0) { + return; + } + + last = last.prev; + size--; + + if (last == null) { + top = null; + } + } + + @Override + public boolean containsAll(@NotNull Collection c) { + for (Object e : c) { + if (!contains(e)) { + return false; + } + } + + return true; + } + + @Override + public boolean addAll(@NotNull Collection c) { + for (E e : c) { + add(e); + } + + return true; + } + + @Override + public boolean removeAll(@NotNull Collection c) { + boolean result = false; + + for (Object e : c) { + if (remove(e)) { + result = true; + } + } + + return result; + } + + @Override + public boolean retainAll(@NotNull Collection c) { + while (!c.contains(top.value)) { + top = top.next; + size--; + } + + Node temp = top; + + while (temp != null) { + if (!c.contains(temp.next.value)) { + temp.next = temp.next.next; + size--; + } + + temp = temp.next; + } + + return size > 0; + } + + @Override + public void clear() { + top = null; + last = null; + + size = 0; + } + + private static class Node { + private final E value; + + private Node prev; + private Node next; + + public Node(E value) { + this.value = value; + } + + public Node(Node prev, E value, Node next) { + this.prev = prev; + this.value = value; + this.next = next; + } + } + + private static class DoublyLinkedListIterator implements Iterator { + private Node current; + + public DoublyLinkedListIterator(Node next) { + current = next; + } + + + @Override + public boolean hasNext() { + return current != null; + } + + @Override + public E next() { + if (!hasNext()) { + throw new NoSuchElementException(); + } + + E result = current.value; + current = current.next; + + return result; + } + } +} diff --git a/src/com/walking/lesson39_queue1/collection/SinglyLinkedList.java b/src/com/walking/lesson39_queue1/collection/SinglyLinkedList.java new file mode 100644 index 000000000..b7bd0a5ba --- /dev/null +++ b/src/com/walking/lesson39_queue1/collection/SinglyLinkedList.java @@ -0,0 +1,217 @@ +package com.walking.lesson39_queue1.collection; + +import org.jetbrains.annotations.NotNull; + +import java.util.*; + +public class SinglyLinkedList implements Collection { + private Node top; + private int size; + + public SinglyLinkedList() { + } + + public SinglyLinkedList(E element) { + this.top = new Node<>(element); + size++; + } + + public E getTop() { + return top.value; + } + + public void reverse() { + Node prev = null; + while (top != null) { + Node next = top.next; + top.next = prev; + prev = top; + top = next; + } + + top = prev; + } + + @Override + public int size() { + return size; + } + + @Override + public boolean isEmpty() { + return size == 0; + } + + @Override + public boolean contains(Object o) { + Node temp = top; + + while (temp != null) { + if (Objects.equals(o, temp.value)) { + return true; + } + + temp = temp.next; + } + + return false; + } + + @Override + public @NotNull Iterator iterator() { + return new SinglyLinkedListIterator<>(top); + } + + @Override + public Object @NotNull [] toArray() { + Object[] array = new Object[size]; + Node temp = top; + + for (int i = 0; i < size; i++) { + array[i] = temp.value; + temp = temp.next; + } + + return array; + } + + @Override + public T @NotNull [] toArray(T @NotNull [] a) { + return (T[]) Arrays.copyOf(toArray(a), size, a.getClass()); + } + + @Override + public boolean add(E e) { + this.top = new Node<>(top, e); + size++; + + return true; + } + + @Override + public boolean remove(Object o) { + if (Objects.equals(o, top.value)) { + top = top.next; + size--; + + return true; + } + + Node temp = top; + + while (temp.next != null) { + if (Objects.equals(o, temp.next.value)) { + temp.next = temp.next.next; + size--; + + return true; + } + + temp = temp.next; + } + + return false; + } + + @Override + public boolean containsAll(Collection c) { + for (Object e : c) { + if (!contains(e)) { + return false; + } + } + + return true; + } + + @Override + public boolean addAll(@NotNull Collection c) { + for (E e : c) { + add(e); + } + + return true; + } + + @Override + public boolean removeAll(@NotNull Collection c) { + boolean removed = false; + Node temp = top; + + for (Object e : c) { + if (Objects.equals(temp.value, e)) { + temp = temp.next; + size--; + + removed = true; + } + } + + return removed; + } + + @Override + public boolean retainAll(Collection c) { + while (!c.contains(top.value)) { + top = top.next; + size--; + } + + Node temp = top; + + while (temp.next != null) { + if (!c.contains(temp.next.value)) { + temp.next = temp.next.next; + size--; + } + } + + return size > 0; + } + + @Override + public void clear() { + top = null; + size = 0; + } + + private static class Node { + private Node next; + private final E value; + + public Node(E value) { + this.value = value; + } + + public Node(Node next, E value) { + this.next = next; + this.value = value; + } + } + + private static class SinglyLinkedListIterator implements Iterator { + private Node current; + + public SinglyLinkedListIterator(Node top) { + current = top; + } + + + @Override + public boolean hasNext() { + return current != null; + } + + @Override + public E next() { + if (!hasNext()) { + throw new NoSuchElementException(); + } + + E result = current.value; + current = current.next; + + return result; + } + } +} diff --git a/src/com/walking/lesson39_queue1/task1/Main.java b/src/com/walking/lesson39_queue1/task1/Main.java index a19c5ee93..346cf385a 100644 --- a/src/com/walking/lesson39_queue1/task1/Main.java +++ b/src/com/walking/lesson39_queue1/task1/Main.java @@ -1,5 +1,11 @@ package com.walking.lesson39_queue1.task1; +import com.walking.lesson39_queue1.collection.SinglyLinkedList; +import org.jetbrains.annotations.NotNull; + +import java.util.Collection; +import java.util.Iterator; + /** * Реализуйте односвязный список (можно использовать реализацию в рамках * ...). @@ -11,5 +17,36 @@ */ public class Main { public static void main(String[] args) { + SinglyLinkedList testIntegerList = createIntegerList(); + testIntegerList.reverse(); + + for (Integer i : testIntegerList) { + System.out.println(i); + } + } + + private static @NotNull SinglyLinkedList createIntegerList() { + SinglyLinkedList testIntegerList = new SinglyLinkedList<>(); + testIntegerList.add(1); + testIntegerList.add(2); + testIntegerList.add(3); + testIntegerList.add(4); + testIntegerList.add(5); + testIntegerList.add(6); + testIntegerList.add(7); + + return testIntegerList; + } + + private static void dropEvenHashCodeElement(Collection c) { + Iterator iterator = c.iterator(); + + while (iterator.hasNext()) { + E e = iterator.next(); + + if (e.hashCode() % 2 == 0) { + c.remove(e); + } + } } } diff --git a/src/com/walking/lesson39_queue1/task2/Main.java b/src/com/walking/lesson39_queue1/task2/Main.java index e4aa01a2a..dcf64923d 100644 --- a/src/com/walking/lesson39_queue1/task2/Main.java +++ b/src/com/walking/lesson39_queue1/task2/Main.java @@ -1,10 +1,31 @@ package com.walking.lesson39_queue1.task2; +import com.walking.lesson39_queue1.task2.collection.Stack; + /** * Реализуйте структуру данных стек. Используйте односвязный список из Задачи 1. * При этом изменять сам класс, реализующий односвязный список, недопустимо. */ public class Main { public static void main(String[] args) { + Stack stack = createStack(); + + stack.push(7); + System.out.println(stack.pop()); + System.out.println(stack.pop()); + System.out.println(stack.pop()); + System.out.println(stack.pop()); + System.out.println(stack.pop()); + } + + private static Stack createStack() { + Stack stack = new Stack<>(); + stack.push(1); + stack.push(2); + stack.push(3); + stack.push(4); + stack.push(5); + + return stack; } } diff --git a/src/com/walking/lesson39_queue1/task2/collection/Stack.java b/src/com/walking/lesson39_queue1/task2/collection/Stack.java new file mode 100644 index 000000000..9873f706e --- /dev/null +++ b/src/com/walking/lesson39_queue1/task2/collection/Stack.java @@ -0,0 +1,18 @@ +package com.walking.lesson39_queue1.task2.collection; + +import com.walking.lesson39_queue1.collection.SinglyLinkedList; + +public class Stack { + private final SinglyLinkedList list = new SinglyLinkedList<>(); + + public void push(E e) { + list.add(e); + } + + public E pop() { + E result = list.getTop(); + list.remove(result); + + return result; + } +} diff --git a/src/com/walking/lesson39_queue1/task3/Main.java b/src/com/walking/lesson39_queue1/task3/Main.java index 356a857b0..d27c0a922 100644 --- a/src/com/walking/lesson39_queue1/task3/Main.java +++ b/src/com/walking/lesson39_queue1/task3/Main.java @@ -1,5 +1,11 @@ package com.walking.lesson39_queue1.task3; +import com.walking.lesson39_queue1.collection.DoublyLinkedList; +import org.jetbrains.annotations.NotNull; + +import java.util.Collection; +import java.util.Iterator; + /** * Реализуйте двусвязный список. * Реализуйте метод, разворачивающий список. @@ -7,5 +13,44 @@ */ public class Main { public static void main(String[] args) { + DoublyLinkedList testIntegerList = new DoublyLinkedList<>(); + + testIntegerList.add(1); + testIntegerList.add(2); + testIntegerList.add(4); + testIntegerList.add(6); + + testIntegerList.addTop(3); + +// testIntegerList.reverse(); + + for (Integer i : testIntegerList) { + System.out.println(i); + } + } + + private static @NotNull DoublyLinkedList createIntegerList() { + DoublyLinkedList testIntegerList = new DoublyLinkedList<>(); + testIntegerList.add(1); + testIntegerList.add(2); + testIntegerList.add(3); + testIntegerList.add(4); + testIntegerList.add(5); + testIntegerList.add(6); + testIntegerList.add(7); + + return testIntegerList; + } + + private static void dropEvenHashCodeElement(Collection c) { + Iterator iterator = c.iterator(); + + while (iterator.hasNext()) { + E e = iterator.next(); + + if (e.hashCode() % 2 == 0) { + c.remove(e); + } + } } } diff --git a/src/com/walking/lesson39_queue1/task4/Main.java b/src/com/walking/lesson39_queue1/task4/Main.java index 6b8ae7821..9bcb48447 100644 --- a/src/com/walking/lesson39_queue1/task4/Main.java +++ b/src/com/walking/lesson39_queue1/task4/Main.java @@ -1,9 +1,47 @@ package com.walking.lesson39_queue1.task4; +import com.walking.lesson39_queue1.collection.DoublyLinkedList; +import com.walking.lesson39_queue1.task4.collection.Queue; +import org.jetbrains.annotations.NotNull; + +import java.util.Collection; +import java.util.Iterator; + /** * Реализуйте одностороннюю очередь на базе двусвязного списка из Задачи 3. */ public class Main { public static void main(String[] args) { + Queue integerQueue = new Queue<>(); + integerQueue.push(10); + + while (integerQueue != null) { + System.out.println(integerQueue.pop()); + } + } + + private static @NotNull DoublyLinkedList createIntegerList() { + DoublyLinkedList testIntegerList = new DoublyLinkedList<>(); + testIntegerList.add(1); + testIntegerList.add(2); + testIntegerList.add(3); + testIntegerList.add(4); + testIntegerList.add(5); + testIntegerList.add(6); + testIntegerList.add(7); + + return testIntegerList; + } + + private static void dropEvenHashCodeElement(Collection c) { + Iterator iterator = c.iterator(); + + while (iterator.hasNext()) { + E e = iterator.next(); + + if (e.hashCode() % 2 == 0) { + c.remove(e); + } + } } } diff --git a/src/com/walking/lesson39_queue1/task4/collection/Queue.java b/src/com/walking/lesson39_queue1/task4/collection/Queue.java new file mode 100644 index 000000000..527a61a16 --- /dev/null +++ b/src/com/walking/lesson39_queue1/task4/collection/Queue.java @@ -0,0 +1,18 @@ +package com.walking.lesson39_queue1.task4.collection; + +import com.walking.lesson39_queue1.collection.DoublyLinkedList; + +public class Queue { + private final DoublyLinkedList list = new DoublyLinkedList<>(); + + public void push(E e) { + list.add(e); + } + + public E pop() { + E result = list.getTop(); + list.remove(result); + + return result; + } +} diff --git a/src/com/walking/lesson3_casts_conditional_constructions/Task2SwitchCase.java b/src/com/walking/lesson3_casts_conditional_constructions/Task2SwitchCase.java index 5d2771f78..2efa4b6d0 100644 --- a/src/com/walking/lesson3_casts_conditional_constructions/Task2SwitchCase.java +++ b/src/com/walking/lesson3_casts_conditional_constructions/Task2SwitchCase.java @@ -1,5 +1,7 @@ package com.walking.lesson3_casts_conditional_constructions; +import java.util.Scanner; + /** * Написать программу, которая принимает строку с клавиатуры. * Если строка == "Hi" - вывести в консоль "Hello", @@ -10,5 +12,38 @@ */ public class Task2SwitchCase { public static void main(String[] args) { +// Создаем сканер для чтения с клавиатуры + Scanner scanner = new Scanner(System.in); + +// Выводим сообщение "Enter string: " в консоль. +// Данное сообщение не является обязательным, лишь информирует пользователя, +// какое действие от него ожидается + System.out.print("Enter string: "); +// Объявляем переменную s типа String и записываем в нее значение, введенное с клавиатуры + String s = scanner.nextLine(); + +// Сканер более не используется, ее необходимо закрыть. +// Зачем - разберемся, когда будем изучать I/O Streams + scanner.close(); + +// Используем конструкцию switch-case для переменной s + switch (s) { + case "Hi": // Если s равно "Hi" +// Выводим в консоль "Hello" + System.out.println("Hello"); +// Вызываем оператор break, чтобы выйти из switch-case + break; + + case "Bye": + System.out.println("Good bye"); + break; + + case "How are you": + System.out.println("How are your doing"); + break; + + default: // Если значение s не совпадает ни с одним кейсом + System.out.println("Unknown message"); + } } -} +} \ No newline at end of file diff --git a/src/com/walking/lesson40_queue2/Main.java b/src/com/walking/lesson40_queue2/Main.java index 680b28259..4423ed321 100644 --- a/src/com/walking/lesson40_queue2/Main.java +++ b/src/com/walking/lesson40_queue2/Main.java @@ -1,5 +1,8 @@ package com.walking.lesson40_queue2; +import com.walking.lesson40_queue2.model.Task; +import com.walking.lesson40_queue2.service.TaskService; + /** * Реализуйте класс Задание. Он должен содержать поле Название, * состав остальных полей - на ваше усмотрение. @@ -15,5 +18,20 @@ */ public class Main { public static void main(String[] args) { + TaskService checkList = new TaskService(); + checkList.add(new Task("1")); + checkList.add(new Task("2")); + checkList.add(new Task("3")); + checkList.add(new Task("4")); + + checkList.complete(); + checkList.complete(); + + checkList.add(new Task("5")); + + checkList.complete(); + checkList.complete(); + checkList.complete(); + checkList.complete(); } } diff --git a/src/com/walking/lesson40_queue2/model/Task.java b/src/com/walking/lesson40_queue2/model/Task.java new file mode 100644 index 000000000..de578485d --- /dev/null +++ b/src/com/walking/lesson40_queue2/model/Task.java @@ -0,0 +1,13 @@ +package com.walking.lesson40_queue2.model; + +public class Task { + private final String name; + + public Task(String name) { + this.name = name; + } + + public String getName() { + return name; + } +} diff --git a/src/com/walking/lesson40_queue2/service/TaskService.java b/src/com/walking/lesson40_queue2/service/TaskService.java new file mode 100644 index 000000000..8a1b2a7fa --- /dev/null +++ b/src/com/walking/lesson40_queue2/service/TaskService.java @@ -0,0 +1,27 @@ +package com.walking.lesson40_queue2.service; + +import com.walking.lesson40_queue2.model.Task; + +import java.util.LinkedList; +import java.util.Queue; + +public class TaskService { + Queue checkList = new LinkedList<>(); + + public boolean add(Task e) { + checkList.offer(e); + System.out.printf("Task %s has been added\n", e.getName()); + + return true; + } + + public void complete() { + Task task = checkList.poll(); + + if (task == null) { + System.out.println("CheckList is empty"); + } else { + System.out.printf("Task %s is complete\n", task.getName()); + } + } +} diff --git a/src/com/walking/lesson41_set/task1/Main.java b/src/com/walking/lesson41_set/task1/Main.java index 634eca5f2..4edef3fed 100644 --- a/src/com/walking/lesson41_set/task1/Main.java +++ b/src/com/walking/lesson41_set/task1/Main.java @@ -1,5 +1,8 @@ package com.walking.lesson41_set.task1; +import com.walking.lesson41_set.task1.model.Task; +import com.walking.lesson41_set.task1.service.TaskService; + /** * Реализуйте задачу * ..., @@ -9,5 +12,16 @@ */ public class Main { public static void main(String[] args) { + TaskService tasks = new TaskService(); + + tasks.add(new Task("3")); + tasks.add(new Task("14")); + tasks.add(new Task("12")); + tasks.add(new Task("1")); + + tasks.complete(); + tasks.complete(); + tasks.complete(); + tasks.complete(); } } diff --git a/src/com/walking/lesson41_set/task1/model/Task.java b/src/com/walking/lesson41_set/task1/model/Task.java new file mode 100644 index 000000000..cc6e91383 --- /dev/null +++ b/src/com/walking/lesson41_set/task1/model/Task.java @@ -0,0 +1,29 @@ +package com.walking.lesson41_set.task1.model; + +import org.jetbrains.annotations.NotNull; + +public class Task implements Comparable { + private final String name; + private int index; + + public Task(String name) { + this.name = name; + } + + public String getName() { + return name; + } + + public int getIndex() { + return index; + } + + public void setIndex(int index) { + this.index = index; + } + + @Override + public int compareTo(@NotNull Task o) { + return Integer.compare(index, o.getIndex()); + } +} diff --git a/src/com/walking/lesson41_set/task1/service/TaskService.java b/src/com/walking/lesson41_set/task1/service/TaskService.java new file mode 100644 index 000000000..7f20bff97 --- /dev/null +++ b/src/com/walking/lesson41_set/task1/service/TaskService.java @@ -0,0 +1,32 @@ +package com.walking.lesson41_set.task1.service; + +import com.walking.lesson41_set.task1.model.Task; + +import java.util.TreeSet; + +public class TaskService { + private final TreeSet tasks = new TreeSet<>(); + + public boolean add(Task task) { + tasks.add(task); + task.setIndex(tasks.size()); + System.out.printf("Task %s added and his index is %d\n", task.getName(), task.getIndex()); + + return true; + } + + public void complete() { + Task task = tasks.pollLast(); + + if (tasks.isEmpty()) { + System.out.println("TaskList is empty!"); + return; + } + + for (Task t : tasks) { + t.setIndex(t.getIndex() - 1); + } + + System.out.printf("Task %s completed\n", task.getName()); + } +} diff --git a/src/com/walking/lesson41_set/task2/Main.java b/src/com/walking/lesson41_set/task2/Main.java index da8e67044..ffa756ea9 100644 --- a/src/com/walking/lesson41_set/task2/Main.java +++ b/src/com/walking/lesson41_set/task2/Main.java @@ -1,11 +1,32 @@ package com.walking.lesson41_set.task2; +import java.util.HashSet; +import java.util.Scanner; +import java.util.Set; + /** * Реализуйте задачу * ..., * используя Set. */ public class Main { + public static final Scanner SCANNER = new Scanner(System.in); + public static void main(String[] args) { + System.out.print("Enter words: "); + String[] words = SCANNER.nextLine() + .trim() + .toLowerCase() + .split(" "); + + SCANNER.close(); + Set wordsHashSet = new HashSet<>(); + + for (String s : words) { + wordsHashSet.add(s); + } + + System.out.printf("Found %d unique words", wordsHashSet.size()); + System.out.println(wordsHashSet); } } diff --git a/src/com/walking/lesson42_tree/task1/Main.java b/src/com/walking/lesson42_tree/task1_easy/Main.java similarity index 65% rename from src/com/walking/lesson42_tree/task1/Main.java rename to src/com/walking/lesson42_tree/task1_easy/Main.java index 082700c06..84b12048f 100644 --- a/src/com/walking/lesson42_tree/task1/Main.java +++ b/src/com/walking/lesson42_tree/task1_easy/Main.java @@ -1,4 +1,6 @@ -package com.walking.lesson42_tree.task1; +package com.walking.lesson42_tree.task1_easy; + +import com.walking.lesson42_tree.task1_easy.structure.UnbalancedBinaryTree; /** * Реализуйте бинарное дерево поиска. Учтите возможность использования дерева как для Comparable-сущностей, @@ -15,5 +17,30 @@ */ public class Main { public static void main(String[] args) { + UnbalancedBinaryTree tree = new UnbalancedBinaryTree<>(); + + tree.add(30); + tree.add(57); + tree.add(18); + tree.add(65); + tree.add(40); + tree.add(9); + tree.add(96); + tree.add(24); + tree.add(12); + tree.add(98); + tree.add(62); + tree.add(55); + tree.add(31); + tree.add(20); + +// tree.delete(40); +// tree.straightBypass(); + +// tree.printReverseTree(); + +// tree.middlePrintTree(); + + tree.widthBypass(); } } diff --git a/src/com/walking/lesson42_tree/task1_easy/structure/UnbalancedBinaryTree.java b/src/com/walking/lesson42_tree/task1_easy/structure/UnbalancedBinaryTree.java new file mode 100644 index 000000000..89be5cbeb --- /dev/null +++ b/src/com/walking/lesson42_tree/task1_easy/structure/UnbalancedBinaryTree.java @@ -0,0 +1,396 @@ +package com.walking.lesson42_tree.task1_easy.structure; + +import org.jetbrains.annotations.NotNull; + +import java.util.*; + +public class UnbalancedBinaryTree { + private Node root; + + private int level; + + + public void add(E e) { + if (root == null) { + root = new Node<>(e); + System.out.printf("Element %s added\n", e.toString()); + return; + } + + add(root, new Node<>(e)); + } + + private void add(Node current, Node node) { + if (node.compareTo(current) > 0) { + if (current.right == null) { + current.right = node; + System.out.printf("element %s added\n", node.value.toString()); + return; + } + + add(current.right, node); + return; + } + + if (current.left == null) { + current.left = node; + System.out.printf("element %s added\n", node.value.toString()); + return; + } + + add(current.left, node); + } + + public E getMaxLeaf() { + if (root == null) { + System.out.println("Main root is null! "); + return null; + } + + return getMaxLeaf(root); + } + + public E getMaxLeaf(Node current) { + if (current == null) { + System.out.println("Current root is null!"); + return null; + } + + if (current.right == null) { + return current.value; + } + + return getMaxLeaf(current.right); + } + + public E getMinLeaf() { + if (root == null) { + System.out.println("Main root is null!"); + return null; + } + + return getMinLeaf(root); + } + + public E getMinLeaf(Node currentRoot) { + if (currentRoot == null) { + System.out.println("Current Root is null! "); + return null; + } + + if (currentRoot.left == null) { + return currentRoot.value; + } + + return getMinLeaf(currentRoot.left); + } + + private boolean isHasTwoChild(Node currentRoot) { + return currentRoot.left != null && currentRoot.right != null; + } + + private boolean isHasRightChild(Node currentRot) { + return currentRot.right != null; + } + + private boolean isHasLeftChild(Node currentRoot) { + return currentRoot.left != null; + } + + private Node findParentNode(Node required) { + if (root == null) { + System.out.println("Required node not found"); + return null; + } + + if (required.compareTo(root) == 0) { + throw new RuntimeException("Required node doesn't have a parent!"); + } + + return required.compareTo(root) > 0 + ? findParentNode(root.right, required) + : findParentNode(root.left, required); + } + + private Node findParentNode(Node current, Node required) { + if (current == null) { + throw new RuntimeException("Element not found"); + } + + if (isHasLeftChild(current) || isHasRightChild(current)) { + if (required.compareTo(current.left) == 0 || required.compareTo(current.right) == 0) { + return current; + } + } + + return required.compareTo(current) > 0 + ? findParentNode(current.right, required) + : findParentNode(current.left, required); + } + + public Node delete(E e) { //Удаление по значению + Node required = new Node<>(e); + Node parentNode = findParentNode(required); //находим родительский узел, один из потомков которого является удаляемым узлом + if (parentNode == null) { + throw new RuntimeException("Element not found"); + } + + return delete(required, parentNode); + } + + private Node delete(Node required) { // удаление по Узлу + Node parent = findParentNode(required); + if (parent == null) { + throw new RuntimeException("Element not found"); + } + + return delete(required, parent); + } + + private @NotNull Node delete(Node required, Node parent) { + Node removed; + if (required.compareTo(parent.left) == 0) { //Если необходимо удалить левого потомка родительского узла + removed = parent.left; //Присваеваем ссылку на удаляемый узел(здесь - левый) во временную переменную, которую будем возвращать + + if (isHasTwoChild(parent.left)) {// если удаляемый узел имеет двух потомков + parent.left = delete(getMaxLeaf(parent.left.left));// ищем максимальный лист левого потомка удаляемого элемента +// // и присваеваем ссылку, удаляя ссылку на найденный лист + } else if (isHasLeftChild(parent.left)) {// если удаляемый элемент имеет только левого потомка + parent.left = parent.left.left; + } else { + parent.left = parent.left.right; + } + } else { // в противном случае мы точно понимаем, что нам нужно удалить правого потомка родительского узла + removed = parent.right; //Присваеваем ссылку на удаляемый узел(здесь - правый) во временную переменную, которую будем возвращать + + if (isHasTwoChild(parent.right)) { + parent.right = delete(parent.right.left); + } else if (isHasLeftChild(parent.right)) { + parent.right = parent.right.left; + } else { + parent.right = parent.right.right; + } + } + + System.out.printf("Element %s deleted\n", removed.value); + return removed; + } + + public void straightBypass() { + if (root == null) { + System.out.println("Root is empty"); + return; + } + List list = new LinkedList<>(); + list.add(root.value); + + if (isHasLeftChild(root)) { + straightBypass(root.left, list); + } + + if (isHasRightChild(root)) { + straightBypass(root.right, list); + } + + for (Object o : list) { + System.out.println(o); + } + } + + private void straightBypass(Node current, Collection list) { + if (current == null) { + return; + } + + list.add(current.value); + + if (isHasLeftChild(current)) { + straightBypass(current.left, list); + } + + if (isHasRightChild(current)) { + straightBypass(current.right, list); + } + } + + public void middleBypass() { + if (root == null) { + System.out.println("Root is empty!"); + return; + } + + List list = new LinkedList<>(); + + if (isHasLeftChild(root)) { + middleBypass(root.left, list); + } + + list.add(root.value); + + if (isHasRightChild(root)) { + middleBypass(root.right, list); + } + + for (Object o : list) { + System.out.println(o); + } + } + + private void middleBypass(Node current, Collection list) { + if (current == null) { + return; + } + + if (isHasLeftChild(current)) { + middleBypass(current.left, list); + } + + list.add(current.value); + + if (isHasRightChild(current)) { + middleBypass(current.right, list); + } + } + + public void reverseBypass() { + if (root == null) { + System.out.println("Root is empty"); + return; + } + List list = new LinkedList<>(); + + if (isHasLeftChild(root)) { + reverseBypass(root.left, list); + } + + if (isHasRightChild(root)) { + reverseBypass(root.right, list); + } + + list.add(root.value); + + for (Object o : list) { + System.out.println(o); + } + } + + private void reverseBypass(Node current, Collection list) { + if (current == null) { + return; + } + + if (isHasLeftChild(current)) { + reverseBypass(current.left, list); + } + + if (isHasRightChild(current)) { + reverseBypass(current.right, list); + } + + list.add(current.value); + } + + public void widthBypass() { + if (root == null) { + System.out.println("Root is empty!"); + return; + } + + List valueQueue = new LinkedList<>(); + Queue> nodeQueue = new LinkedList<>(); + valueQueue.add(root.value); + + if (isHasLeftChild(root)) { + valueQueue.add(root.left.value); + nodeQueue.add(root.left); + } + if (isHasRightChild(root)) { + valueQueue.add(root.right.value); + nodeQueue.add(root.right); + } + + widthBypass(valueQueue, nodeQueue); + + for (E e : valueQueue) { + System.out.println(e); + } + } + + private void widthBypass(Collection collection, Queue> nodeQueue) { + if (nodeQueue.isEmpty()) { + return; + } + + Queue> newNodeQueue = new LinkedList<>(); + for (Node n : nodeQueue) { + if (isHasLeftChild(n)) { + collection.add(n.left.value); + newNodeQueue.add(n.left); + } + + if (isHasRightChild(n)) { + collection.add(n.right.value); + newNodeQueue.add(n.right); + } + } + + widthBypass(collection, newNodeQueue); + } + + public class Node implements Comparable> { + private final E value; + + private Node left; + private Node right; + private int level; + + public Node(E value) { + this.value = value; + } + + public E getValue() { + return value; + } + + public int getLevel() { + return level; + } + + @Override + public boolean equals(Object o) { + if (this == o) { + return true; + } + + if (o == null || getClass() != o.getClass()) { + return false; + } + + Node node = (Node) o; + return Objects.equals(value, node.value); + } + + @Override + public int hashCode() { + return Objects.hashCode(value); + } + + @Override + public int compareTo(@NotNull Node o) { + if (hashCode() < o.hashCode()) { + return -1; + } + + if (hashCode() > o.hashCode()) { + return 1; + } + + return 0; + } + + @Override + public String toString() { + return value.toString(); + } + } +}