diff --git a/src/com/walking/lesson14_polymorphism/task1/Main.java b/src/com/walking/lesson14_polymorphism/task1/Main.java index 41022d7f2..e4ee4acbf 100644 --- a/src/com/walking/lesson14_polymorphism/task1/Main.java +++ b/src/com/walking/lesson14_polymorphism/task1/Main.java @@ -1,16 +1,46 @@ package com.walking.lesson14_polymorphism.task1; +import com.walking.lesson14_polymorphism.task1.figure.RegularFigure; +import com.walking.lesson14_polymorphism.task1.figure.Square; +import com.walking.lesson14_polymorphism.task1.figure.Triangle; + +import java.util.Scanner; + /** * Реализуйте класс «Правильная фигура». * Для него создайте классы-наследники «Треугольник» и «Квадрат». *

- * Пользователь должен иметь возможность ввести длину стороны и выбрать тип фигуры. - * Программа должна нарисовать в консоли выбранную пользователем фигуру, - * используя символы '-', '|', '/', '\'. + * Пользователь должен иметь возможность ввести длину стороны и выбрать тип фигуры. + * Программа должна нарисовать в консоли выбранную пользователем фигуру, + * используя символы '-', '|', '/', '\'. *

* Обратите внимание, символ '\' в Java необходимо экранировать: '\\'. */ + public class Main { - public static void main(String[] args) { + + public static void main(String[] args) { + Scanner in = new Scanner(System.in); + System.out.print("Введите тип фигуры: "); + String figureType = in.nextLine(); + System.out.print("Введите длину стороны: "); + int length = in.nextInt(); + + if (length < 1) { + System.out.println("Некорректный ввод"); + return; + } + + RegularFigure figure = getFigure(figureType, length); + + System.out.println(figure.getFigure()); + } + + private static RegularFigure getFigure(String figureType, int length) { + return switch (figureType.toLowerCase()) { + case Triangle.NAME -> new Triangle(length); + case Square.NAME -> new Square(length); + default -> new RegularFigure(length); + }; + } } -} diff --git a/src/com/walking/lesson14_polymorphism/task1/figure/RegularFigure.java b/src/com/walking/lesson14_polymorphism/task1/figure/RegularFigure.java new file mode 100644 index 000000000..2b8a21022 --- /dev/null +++ b/src/com/walking/lesson14_polymorphism/task1/figure/RegularFigure.java @@ -0,0 +1,18 @@ +package com.walking.lesson14_polymorphism.task1.figure; + +public class RegularFigure { + private final int length; + + public RegularFigure(int length) { + this.length = length; + } + + public String getFigure() { + return "Неизвестная фигура"; + } + + + public int getLength() { + return length; + } +} diff --git a/src/com/walking/lesson14_polymorphism/task1/figure/Square.java b/src/com/walking/lesson14_polymorphism/task1/figure/Square.java new file mode 100644 index 000000000..003fcfcc0 --- /dev/null +++ b/src/com/walking/lesson14_polymorphism/task1/figure/Square.java @@ -0,0 +1,30 @@ +package com.walking.lesson14_polymorphism.task1.figure; + +public class Square extends RegularFigure { + public static final String NAME = "квадрат"; + + private final String HORIZONTAL = "-"; + private final String VERTICAL = "|"; + private final String SPACE = " "; + + public Square(int length) { + super(length); + } + + @Override + public String getFigure() { + String square = getHorizontalSide(); + for (int i = 0; i < getLength() - 2; i++) { + square += getVerticalSide(); + } + return square + getHorizontalSide(); + } + + private String getHorizontalSide() { + return SPACE + HORIZONTAL.repeat(getLength() - 2) + SPACE + "\n"; + } + + private String getVerticalSide() { + return VERTICAL + SPACE.repeat(getLength() - 2) + VERTICAL + "\n"; + } +} diff --git a/src/com/walking/lesson14_polymorphism/task1/figure/Triangle.java b/src/com/walking/lesson14_polymorphism/task1/figure/Triangle.java new file mode 100644 index 000000000..7be11199a --- /dev/null +++ b/src/com/walking/lesson14_polymorphism/task1/figure/Triangle.java @@ -0,0 +1,38 @@ +package com.walking.lesson14_polymorphism.task1.figure; + +public class Triangle extends RegularFigure { + public static final String NAME = "треугольник"; + + private final String RIGHT_SIDE = "\\"; + private final String LEFT_SIDE = "/"; + private final String BOTTOM_SIDE = "_"; + private final String SPACE = " "; + + public Triangle(int length) { + super(length); + } + + @Override + public String getFigure() { + return getTriangle() + getBottomSide(); + } + + private String getBottomSide() { + return LEFT_SIDE + BOTTOM_SIDE.repeat(getLength()) + RIGHT_SIDE; + } + + private String getTriangle() { + int k = getLength() / 2; + int j = getLength() % 2; + + String triangle = ""; + for (int i = 0; i < getLength() / 2; i++) { + triangle += SPACE.repeat(k) + LEFT_SIDE + SPACE.repeat(j) + RIGHT_SIDE + "\n"; + k--; + j += 2; + } + + return triangle; + } + +} 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..cef21ec3a 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,13 @@ package com.walking.lesson16_abstract_class_interface.task1_abstract_class; + +import com.walking.lesson16_abstract_class_interface.task1_abstract_class.figures.RegularFigure; +import com.walking.lesson16_abstract_class_interface.task1_abstract_class.figures.Square; +import com.walking.lesson16_abstract_class_interface.task1_abstract_class.figures.Triangle; +import com.walking.lesson16_abstract_class_interface.task1_abstract_class.figures.Unknown; + +import java.util.Scanner; + /** * Реализуйте задачу * ... @@ -7,5 +15,23 @@ */ public class Main { public static void main(String[] args) { + Scanner in = new Scanner(System.in); + System.out.print("Введите тип фигуры: "); + String figureType = in.nextLine(); + System.out.print("Введите длину стороны: "); + int length = in.nextInt(); + + if (length < 1) { + System.out.println("Некорректный ввод"); + return; + } + + RegularFigure figure = switch (figureType.toLowerCase()) { + case Triangle.NAME -> new Triangle(length); + case Square.NAME -> new Square(length); + default -> new Unknown(length); + }; + + System.out.println(figure.getFigure()); } } diff --git a/src/com/walking/lesson16_abstract_class_interface/task1_abstract_class/figures/RegularFigure.java b/src/com/walking/lesson16_abstract_class_interface/task1_abstract_class/figures/RegularFigure.java new file mode 100644 index 000000000..177f8fa95 --- /dev/null +++ b/src/com/walking/lesson16_abstract_class_interface/task1_abstract_class/figures/RegularFigure.java @@ -0,0 +1,17 @@ +package com.walking.lesson16_abstract_class_interface.task1_abstract_class.figures; + +public abstract class RegularFigure { + protected final String SPACE = " "; + protected final String NEXT_LINE_SYMBOL = "\n"; + private final int length; + + protected RegularFigure(int length) { + this.length = length; + } + + public abstract String getFigure(); + + public int getLength() { + return length; + } +} diff --git a/src/com/walking/lesson16_abstract_class_interface/task1_abstract_class/figures/Square.java b/src/com/walking/lesson16_abstract_class_interface/task1_abstract_class/figures/Square.java new file mode 100644 index 000000000..0a15ce1f4 --- /dev/null +++ b/src/com/walking/lesson16_abstract_class_interface/task1_abstract_class/figures/Square.java @@ -0,0 +1,29 @@ +package com.walking.lesson16_abstract_class_interface.task1_abstract_class.figures; + +public class Square extends RegularFigure { + public static final String NAME = "квадрат"; + + private final String HORIZONTAL = "-"; + private final String VERTICAL = "|"; + + public Square(int length) { + super(length); + } + + @Override + public String getFigure() { + String square = getHorizontalSide(); + for (int i = 0; i < getLength() - 2; i++) { + square += getVerticalSide(); + } + return square + getHorizontalSide(); + } + + private String getHorizontalSide() { + return SPACE + HORIZONTAL.repeat(getLength() - 2) + SPACE + NEXT_LINE_SYMBOL; + } + + private String getVerticalSide() { + return VERTICAL + SPACE.repeat(getLength() - 2) + VERTICAL + NEXT_LINE_SYMBOL; + } +} diff --git a/src/com/walking/lesson16_abstract_class_interface/task1_abstract_class/figures/Triangle.java b/src/com/walking/lesson16_abstract_class_interface/task1_abstract_class/figures/Triangle.java new file mode 100644 index 000000000..af4bd897e --- /dev/null +++ b/src/com/walking/lesson16_abstract_class_interface/task1_abstract_class/figures/Triangle.java @@ -0,0 +1,37 @@ +package com.walking.lesson16_abstract_class_interface.task1_abstract_class.figures; + +public class Triangle extends RegularFigure { + public static final String NAME = "треугольник"; + + private final String RIGHT_SIDE = "\\"; + private final String LEFT_SIDE = "/"; + private final String BOTTOM_SIDE = "_"; + + + public Triangle(int length) { + super(length); + } + + @Override + public String getFigure() { + return getTriangle() + getBottomSide(); + } + + private String getBottomSide() { + return LEFT_SIDE + BOTTOM_SIDE.repeat(getLength()) + RIGHT_SIDE; + } + + private String getTriangle() { + int k = getLength() / 2; + int j = getLength() % 2; + + String triangle = ""; + for (int i = 0; i < getLength() / 2; i++) { + triangle += SPACE.repeat(k) + LEFT_SIDE + SPACE.repeat(j) + RIGHT_SIDE + NEXT_LINE_SYMBOL; + k--; + j += 2; + } + + return triangle; + } +} diff --git a/src/com/walking/lesson16_abstract_class_interface/task1_abstract_class/figures/Unknown.java b/src/com/walking/lesson16_abstract_class_interface/task1_abstract_class/figures/Unknown.java new file mode 100644 index 000000000..7fb4fde9a --- /dev/null +++ b/src/com/walking/lesson16_abstract_class_interface/task1_abstract_class/figures/Unknown.java @@ -0,0 +1,13 @@ +package com.walking.lesson16_abstract_class_interface.task1_abstract_class.figures; + +public class Unknown extends RegularFigure { + + public Unknown(int length) { + super(length); + } + + @Override + public String getFigure() { + return "Неизвестная фигура"; + } +} 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..6cb3f91ad 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,6 +1,5 @@ package com.walking.lesson16_abstract_class_interface.task1_interface; - /** * Реализуйте задачу * ... @@ -8,5 +7,7 @@ */ public class Main { public static void main(String[] args) { + } + } 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..d5d4113ea 100644 --- a/src/com/walking/lesson16_abstract_class_interface/task2/Main.java +++ b/src/com/walking/lesson16_abstract_class_interface/task2/Main.java @@ -1,5 +1,9 @@ package com.walking.lesson16_abstract_class_interface.task2; +import com.walking.lesson16_abstract_class_interface.task2.greet.*; + +import java.util.Scanner; + /** * Реализуйте задачу * ... @@ -7,5 +11,19 @@ */ public class Main { public static void main(String[] args) { + Scanner in = new Scanner(System.in); + System.out.print("Enter message: "); + String message = in.nextLine(); + + System.out.println(getGreeting(message)); + } + + private static Greeting getGreeting(String message) { + return switch (message) { + case "Hi" -> new Hello(); + case "Bye" -> new Goodbye(); + case "How are you" -> new How(); + default -> new Unknown(); + }; } } diff --git a/src/com/walking/lesson16_abstract_class_interface/task2/greet/Goodbye.java b/src/com/walking/lesson16_abstract_class_interface/task2/greet/Goodbye.java new file mode 100644 index 000000000..8ad592b3f --- /dev/null +++ b/src/com/walking/lesson16_abstract_class_interface/task2/greet/Goodbye.java @@ -0,0 +1,10 @@ +package com.walking.lesson16_abstract_class_interface.task2.greet; + +public class Goodbye implements Greeting { + final static String RESPOND = "Goodbye"; + + @Override + public String greet() { + return RESPOND; + } +} diff --git a/src/com/walking/lesson16_abstract_class_interface/task2/greet/Greeting.java b/src/com/walking/lesson16_abstract_class_interface/task2/greet/Greeting.java new file mode 100644 index 000000000..543b3fbf2 --- /dev/null +++ b/src/com/walking/lesson16_abstract_class_interface/task2/greet/Greeting.java @@ -0,0 +1,7 @@ +package com.walking.lesson16_abstract_class_interface.task2.greet; + +public interface Greeting { + + String greet(); + +} diff --git a/src/com/walking/lesson16_abstract_class_interface/task2/greet/Hello.java b/src/com/walking/lesson16_abstract_class_interface/task2/greet/Hello.java new file mode 100644 index 000000000..8eab8a8f0 --- /dev/null +++ b/src/com/walking/lesson16_abstract_class_interface/task2/greet/Hello.java @@ -0,0 +1,10 @@ +package com.walking.lesson16_abstract_class_interface.task2.greet; + +public class Hello implements Greeting { + final static String RESPOND = "Hello"; + + @Override + public String greet() { + return RESPOND; + } +} diff --git a/src/com/walking/lesson16_abstract_class_interface/task2/greet/How.java b/src/com/walking/lesson16_abstract_class_interface/task2/greet/How.java new file mode 100644 index 000000000..396b750ce --- /dev/null +++ b/src/com/walking/lesson16_abstract_class_interface/task2/greet/How.java @@ -0,0 +1,11 @@ +package com.walking.lesson16_abstract_class_interface.task2.greet; + +public class How implements Greeting { + final static String RESPOND = "How are you doing"; + + @Override + public String greet() { + return RESPOND; + } + +} diff --git a/src/com/walking/lesson16_abstract_class_interface/task2/greet/Unknown.java b/src/com/walking/lesson16_abstract_class_interface/task2/greet/Unknown.java new file mode 100644 index 000000000..098ecf510 --- /dev/null +++ b/src/com/walking/lesson16_abstract_class_interface/task2/greet/Unknown.java @@ -0,0 +1,8 @@ +package com.walking.lesson16_abstract_class_interface.task2.greet; + +public class Unknown implements Greeting { + @Override + public String greet() { + return "Unknown message"; + } +} 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..bb7cb3fdc 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.animals.Animal; +import com.walking.lesson16_abstract_class_interface.task3.animals.Cat; +import com.walking.lesson16_abstract_class_interface.task3.animals.Cow; +import com.walking.lesson16_abstract_class_interface.task3.animals.Dog; + /** * Реализуйте любую задачу из уроков о наследовании или полиморфизме с использованием новых знаний. * Выбирайте инструмент с умом. @@ -10,5 +15,10 @@ */ public class Main { public static void main(String[] args) { + Animal[] animals = new Animal[] {new Cow(), new Dog(), new Cat()}; + + for (Animal animal : animals) { + animal.sound(); + } } } diff --git a/src/com/walking/lesson16_abstract_class_interface/task3/animals/Animal.java b/src/com/walking/lesson16_abstract_class_interface/task3/animals/Animal.java new file mode 100644 index 000000000..e2e417b14 --- /dev/null +++ b/src/com/walking/lesson16_abstract_class_interface/task3/animals/Animal.java @@ -0,0 +1,6 @@ +package com.walking.lesson16_abstract_class_interface.task3.animals; + +public abstract class Animal { + + public abstract void sound(); +} diff --git a/src/com/walking/lesson16_abstract_class_interface/task3/animals/Cat.java b/src/com/walking/lesson16_abstract_class_interface/task3/animals/Cat.java new file mode 100644 index 000000000..64a0e5287 --- /dev/null +++ b/src/com/walking/lesson16_abstract_class_interface/task3/animals/Cat.java @@ -0,0 +1,11 @@ +package com.walking.lesson16_abstract_class_interface.task3.animals; + +public class Cat extends Animal { + private final String SOUND = "meow"; + + + public void sound() { + System.out.println(SOUND); + } + +} diff --git a/src/com/walking/lesson16_abstract_class_interface/task3/animals/Cow.java b/src/com/walking/lesson16_abstract_class_interface/task3/animals/Cow.java new file mode 100644 index 000000000..76e5d2c03 --- /dev/null +++ b/src/com/walking/lesson16_abstract_class_interface/task3/animals/Cow.java @@ -0,0 +1,11 @@ +package com.walking.lesson16_abstract_class_interface.task3.animals; + +public class Cow extends Animal { + private final String SOUND = "moo"; + + + public void sound() { + System.out.println(SOUND); + } + +} diff --git a/src/com/walking/lesson16_abstract_class_interface/task3/animals/Dog.java b/src/com/walking/lesson16_abstract_class_interface/task3/animals/Dog.java new file mode 100644 index 000000000..eb9cd229a --- /dev/null +++ b/src/com/walking/lesson16_abstract_class_interface/task3/animals/Dog.java @@ -0,0 +1,11 @@ +package com.walking.lesson16_abstract_class_interface.task3.animals; + +public class Dog extends Animal { + private final String SOUND = "woof"; + + + public void sound() { + System.out.println(SOUND); + } + +} diff --git a/src/com/walking/lesson17_enum/task1/Main.java b/src/com/walking/lesson17_enum/task1/Main.java index 7fc684202..8c028c396 100644 --- a/src/com/walking/lesson17_enum/task1/Main.java +++ b/src/com/walking/lesson17_enum/task1/Main.java @@ -1,5 +1,11 @@ package com.walking.lesson17_enum.task1; +import com.walking.lesson17_enum.task1.greetings.GreetingType; + +import java.util.Scanner; + + + /** * Реализуйте задачу * ... @@ -8,5 +14,12 @@ */ public class Main { public static void main(String[] args) { + Scanner in = new Scanner(System.in); + System.out.print("Enter message: "); + String greeting = in.nextLine(); + + GreetingType greet = GreetingType.findGreetingType(greeting); + System.out.println(greet.getRespond()); + } } diff --git a/src/com/walking/lesson17_enum/task1/greetings/GreetingType.java b/src/com/walking/lesson17_enum/task1/greetings/GreetingType.java new file mode 100644 index 000000000..4d124f6f5 --- /dev/null +++ b/src/com/walking/lesson17_enum/task1/greetings/GreetingType.java @@ -0,0 +1,38 @@ +package com.walking.lesson17_enum.task1.greetings; + +public enum GreetingType { + + HELLO("Hi", "Hello"), + GOODBYE("Bye", "Goodbye"), + HOW("How are you", "How are you doing"), + UNKNOWN(null, "Unknown message"); + + private final String greeting; + private final String respond; + + GreetingType(String greeting, String respond) { + this.greeting = greeting; + this.respond = respond; + } + + public static GreetingType findGreetingType(String greeting) { + if (greeting == null) { + return UNKNOWN; + } + + for (GreetingType type : GreetingType.values()) { + if (greeting.equals(type.greeting)) { + return type; + } + } + return UNKNOWN; + } + + public String getGreeting() { + return greeting; + } + + public String getRespond() { + return respond; + } +} diff --git a/src/com/walking/lesson17_enum/task2/Main.java b/src/com/walking/lesson17_enum/task2/Main.java index 293ca15c9..01037c444 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.animals.Animal; + /** * Реализуйте задачу * ... @@ -7,5 +9,10 @@ */ public class Main { public static void main(String[] args) { + + Animal[] animals = Animal.values(); + for (Animal animal : animals) { + System.out.println(animal.getSound()); + } } } diff --git a/src/com/walking/lesson17_enum/task2/animals/Animal.java b/src/com/walking/lesson17_enum/task2/animals/Animal.java new file mode 100644 index 000000000..9c9e1c650 --- /dev/null +++ b/src/com/walking/lesson17_enum/task2/animals/Animal.java @@ -0,0 +1,17 @@ +package com.walking.lesson17_enum.task2.animals; + +public enum Animal { + CAT("meow"), + DOG("woof"), + COW("moo"); + + private final String sound; + + Animal(String sound) { + this.sound = sound; + } + + public String getSound() { + return sound; + } +} diff --git a/src/com/walking/lesson17_enum/task3/Main.java b/src/com/walking/lesson17_enum/task3/Main.java index fb541e003..135289954 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.figure.RegularFigure; + +import java.util.Scanner; + /** * Реализуйте задачу * ... @@ -7,5 +11,14 @@ */ public class Main { public static void main(String[] args) { + + Scanner in = new Scanner(System.in); + System.out.print("Введите тип фигуры: "); + String name = in.nextLine(); + System.out.print("Введите длину стороны: "); + int length = in.nextInt(); + + RegularFigure figure = RegularFigure.getFigureByName(name); + System.out.println(figure.getFigure(length)); } } diff --git a/src/com/walking/lesson17_enum/task3/figure/RegularFigure.java b/src/com/walking/lesson17_enum/task3/figure/RegularFigure.java new file mode 100644 index 000000000..fc663143c --- /dev/null +++ b/src/com/walking/lesson17_enum/task3/figure/RegularFigure.java @@ -0,0 +1,75 @@ +package com.walking.lesson17_enum.task3.figure; + + +public enum RegularFigure { + TRIANGLE("треугольник"){ + @Override + public String getFigure(int length) { + int k = length / 2; + int j = length % 2; + + String triangle = ""; + for (int i = 0; i < length / 2; i++) { + triangle += SPACE.repeat(k) + LEFT_SIDE_TRIANGLE + SPACE.repeat(j) + RIGHT_SIDE_TRIANGLE + NEXT_LINE; + k--; + j += 2; + } + + triangle += LEFT_SIDE_TRIANGLE + HORIZONTAL_SIDE.repeat(length) + RIGHT_SIDE_TRIANGLE; + return triangle; + } + }, + + SQUARE("квадрат") { + @Override + public String getFigure(int length) { + String square = SPACE + HORIZONTAL_SQUARE.repeat(length - 2) + SPACE + NEXT_LINE; + for (int i = 0; i < length - 2; i++) { + square += VERTICAL_SQUARE + SPACE.repeat(length - 2) + VERTICAL_SQUARE + NEXT_LINE; + } + square += SPACE + HORIZONTAL_SQUARE.repeat(length - 2) + SPACE + NEXT_LINE; + return square; + } + }, + + UNKNOWN(null) { + @Override + public String getFigure(int length) { + return "Неизвестная фигура"; + } + }; + + private static final String SPACE = " "; + private static final String NEXT_LINE = "\n"; + private static final String RIGHT_SIDE_TRIANGLE = "\\"; + private static final String LEFT_SIDE_TRIANGLE = "/"; + private static final String HORIZONTAL_SIDE = "_"; + private static final String HORIZONTAL_SQUARE = "-"; + private static final String VERTICAL_SQUARE = "|"; + + private final String name; + + RegularFigure(String name) { + this.name = name; + } + + public static RegularFigure getFigureByName(String name) { + if (name == null) { + return UNKNOWN; + } + + for (RegularFigure figure : RegularFigure.values()) { + if (name.toLowerCase().equals(figure.getName())) { + return figure; + } + } + + return UNKNOWN; + } + + public String getName() { + return name; + } + + public abstract String getFigure(int length); +} 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..12e59fc96 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,7 @@ package com.walking.lesson18_instanceof_getClass.task1_getClass; +import com.walking.lesson18_instanceof_getClass.task1_getClass.animals.*; + /** * Реализовать задачу * ... @@ -7,5 +9,17 @@ */ public class Main { public static void main(String[] args) { + Animal[] animals = new Animal[]{new Cat(), new Cow(), new Dog(), new Cow()}; + for (Animal animal : animals) { + if (animal.getClass().equals(Cat.class)) { + ((Cat) animal).meow(); + } else if (animal.getClass().equals(Dog.class)) { + ((Dog) animal).woof(); + } else if (animal.getClass().equals(Cow.class)) { + ((Cow) animal).moo(); + } else { + System.out.println("Unknown animal"); + } + } } } diff --git a/src/com/walking/lesson18_instanceof_getClass/task1_getClass/animals/Animal.java b/src/com/walking/lesson18_instanceof_getClass/task1_getClass/animals/Animal.java new file mode 100644 index 000000000..ed2965c2f --- /dev/null +++ b/src/com/walking/lesson18_instanceof_getClass/task1_getClass/animals/Animal.java @@ -0,0 +1,13 @@ +package com.walking.lesson18_instanceof_getClass.task1_getClass.animals; + +public class Animal { + protected final String sound; + + public Animal(String sound) { + this.sound = sound; + } + + protected void sound() { + System.out.println(sound); + } +} diff --git a/src/com/walking/lesson18_instanceof_getClass/task1_getClass/animals/Cat.java b/src/com/walking/lesson18_instanceof_getClass/task1_getClass/animals/Cat.java new file mode 100644 index 000000000..b6769a6cd --- /dev/null +++ b/src/com/walking/lesson18_instanceof_getClass/task1_getClass/animals/Cat.java @@ -0,0 +1,12 @@ +package com.walking.lesson18_instanceof_getClass.task1_getClass.animals; + +public class Cat extends Animal { + + public Cat() { + super("meow"); + } + + public void meow() { + System.out.println(sound); + } +} diff --git a/src/com/walking/lesson18_instanceof_getClass/task1_getClass/animals/Cow.java b/src/com/walking/lesson18_instanceof_getClass/task1_getClass/animals/Cow.java new file mode 100644 index 000000000..901f9873a --- /dev/null +++ b/src/com/walking/lesson18_instanceof_getClass/task1_getClass/animals/Cow.java @@ -0,0 +1,12 @@ +package com.walking.lesson18_instanceof_getClass.task1_getClass.animals; + +public class Cow extends Animal { + + public Cow() { + super("moo"); + } + + public void moo() { + System.out.println(sound); + } +} diff --git a/src/com/walking/lesson18_instanceof_getClass/task1_getClass/animals/Dog.java b/src/com/walking/lesson18_instanceof_getClass/task1_getClass/animals/Dog.java new file mode 100644 index 000000000..b8cde7296 --- /dev/null +++ b/src/com/walking/lesson18_instanceof_getClass/task1_getClass/animals/Dog.java @@ -0,0 +1,12 @@ +package com.walking.lesson18_instanceof_getClass.task1_getClass.animals; + +public class Dog extends Animal { + + public Dog() { + super("woof"); + } + + public void woof() { + System.out.println(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..494adc8d6 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,8 @@ package com.walking.lesson18_instanceof_getClass.task1_instanceof; + +import com.walking.lesson18_instanceof_getClass.task1_instanceof.animals.*; + /** * Реализовать задачу * ... @@ -7,5 +10,17 @@ */ public class Main { public static void main(String[] args) { + Animal[] animals = new Animal[]{new Cat(), new Cow(), new Dog(), new Cow()}; + for (Animal animal : animals) { + 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/animals/Animal.java b/src/com/walking/lesson18_instanceof_getClass/task1_instanceof/animals/Animal.java new file mode 100644 index 000000000..6fb102725 --- /dev/null +++ b/src/com/walking/lesson18_instanceof_getClass/task1_instanceof/animals/Animal.java @@ -0,0 +1,13 @@ +package com.walking.lesson18_instanceof_getClass.task1_instanceof.animals; + +public class Animal { + protected final String sound; + + public Animal(String sound) { + this.sound = sound; + } + + public void sound() { + System.out.println(); + } +} diff --git a/src/com/walking/lesson18_instanceof_getClass/task1_instanceof/animals/Cat.java b/src/com/walking/lesson18_instanceof_getClass/task1_instanceof/animals/Cat.java new file mode 100644 index 000000000..170c1721c --- /dev/null +++ b/src/com/walking/lesson18_instanceof_getClass/task1_instanceof/animals/Cat.java @@ -0,0 +1,12 @@ +package com.walking.lesson18_instanceof_getClass.task1_instanceof.animals; + +public class Cat extends Animal { + + public Cat() { + super("meow"); + } + + public void meow() { + System.out.println(sound); + } +} diff --git a/src/com/walking/lesson18_instanceof_getClass/task1_instanceof/animals/Cow.java b/src/com/walking/lesson18_instanceof_getClass/task1_instanceof/animals/Cow.java new file mode 100644 index 000000000..b15f76922 --- /dev/null +++ b/src/com/walking/lesson18_instanceof_getClass/task1_instanceof/animals/Cow.java @@ -0,0 +1,12 @@ +package com.walking.lesson18_instanceof_getClass.task1_instanceof.animals; + +public class Cow extends Animal { + + public Cow() { + super("moo"); + } + + public void moo() { + System.out.println(sound); + } +} diff --git a/src/com/walking/lesson18_instanceof_getClass/task1_instanceof/animals/Dog.java b/src/com/walking/lesson18_instanceof_getClass/task1_instanceof/animals/Dog.java new file mode 100644 index 000000000..adf0bf9a2 --- /dev/null +++ b/src/com/walking/lesson18_instanceof_getClass/task1_instanceof/animals/Dog.java @@ -0,0 +1,12 @@ +package com.walking.lesson18_instanceof_getClass.task1_instanceof.animals; + +public class Dog extends Animal { + + public Dog() { + super("woof"); + } + + public void woof() { + System.out.println(sound); + } +} diff --git a/src/com/walking/lesson19_object_methods/Main.java b/src/com/walking/lesson19_object_methods/Main.java index efef54d5d..9f4d4e213 100644 --- a/src/com/walking/lesson19_object_methods/Main.java +++ b/src/com/walking/lesson19_object_methods/Main.java @@ -1,5 +1,9 @@ package com.walking.lesson19_object_methods; +import com.walking.lesson19_object_methods.car.Car; + +import java.util.Scanner; + /** * Реализуйте класс «Машина». Поля допустимо выбрать на свое усмотрение, но необходимо, * чтобы по ним можно было однозначно идентифицировать каждую машину. @@ -14,5 +18,39 @@ */ public class Main { public static void main(String[] args) { + + Car[] cars = new Car[6]; + cars[0] = new Car("Audi", "Печкин Ф.Б.", "уе777к"); + cars[1] = new Car("BMW", "Борисов Ю.А.", "ос025р"); + cars[2] = new Car("Ford", "Снегирь Ю.В.", "мр666м"); + cars[3] = new Car("Bentley", "Белова Д.М.", "ра345з"); + cars[4] = new Car("Ferrari", "Сергеев К.Л.", "уе999з"); + cars[5] = new Car("Москвич", "Попов А.Д.", "ар832с"); + + Scanner in = new Scanner(System.in); + System.out.print("Марка машины: "); + String make = in.nextLine(); + System.out.print("ФИО владельца: "); + String owner = in.nextLine(); + System.out.print("Номер машины: "); + String number = in.nextLine(); + + Car car = new Car(make, owner, number); + + if (!isCarExist(cars, car)) { + System.out.println("Машина не найдена!"); + } else { + System.out.println(car); + System.out.println(car.hashCode()); + } + } + + public static boolean isCarExist(Car[] cars, Car car) { + for (Car car1 : cars) { + if (car1.equals(car)) { + return true; + } + } + return false; } } diff --git a/src/com/walking/lesson19_object_methods/car/Car.java b/src/com/walking/lesson19_object_methods/car/Car.java new file mode 100644 index 000000000..4ca932046 --- /dev/null +++ b/src/com/walking/lesson19_object_methods/car/Car.java @@ -0,0 +1,58 @@ +package com.walking.lesson19_object_methods.car; + +public class Car { + private final String brand; + private final String owner; + private final String number; + + public Car(String brand, String owner, String number) { + this.brand = brand; + this.owner = owner; + this.number = number; + } + + @Override + public String toString() { + return "Машина марки " + brand + ", владелец: " + owner + ", номер: " + number; + } + + @Override + public boolean equals(Object car) { + if (this == car) { + return true; + } + + if (car == null) { + return false; + } + + if (!getClass().equals(car.getClass())) { + return false; + } + + Car auto = (Car) car; + + return number.equals(auto.number) && brand.equals(auto.brand) && owner.equals(auto.owner); + } + + @Override + public int hashCode() { + int result = brand != null ? brand.hashCode() : 0; + result *= 31 + (owner != null ? owner.hashCode() : 0); + result *= 31 + (number != null ? number.hashCode() : 0); + + return result; + } + + public final String getBrand() { + return brand; + } + + public final String getOwner() { + return owner; + } + + public final String getNumber() { + return number; + } +} diff --git a/src/com/walking/lesson20_exceptions/task1_catchException/Main.java b/src/com/walking/lesson20_exceptions/task1_catchException/Main.java index c59fa62d4..a0a8454b1 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.file.File; + +import java.io.FileNotFoundException; +import java.util.Scanner; + +import static com.walking.lesson20_exceptions.task1_catchException.file.FileType.*; + /** * Создайте массив, имитирующий простейшую файловую систему и содержащий объекты файлов. *

@@ -15,5 +22,36 @@ */ public class Main { public static void main(String[] args) { + File[] files = new File[8]; + files[0] = new File("Девятый вал", "109 КБ", PICTURE); + files[1] = new File("Шрек 2", "128 МБ", VIDEO); + files[2] = new File("Три товарища", "895 КБ", TEXT); + files[3] = new File("Эфир", "7.4 МБ", AUDIO); + files[4] = new File("Пока течёт река", "930 КБ", TEXT); + files[5] = new File("М", "8 МБ", AUDIO); + files[6] = new File("Душа", "134 МБ", VIDEO); + files[7] = new File("Смешной мем", "99 КБ", PICTURE); + + Scanner in = new Scanner(System.in); + System.out.print("Введите название файла: "); + String name = in.nextLine(); + + try{ + File file = findFile(files, name); + System.out.println(file); + } + catch (FileNotFoundException ex) { + System.out.println(ex.getMessage()); + } + + } + + public static File findFile(File[] files, String name) throws FileNotFoundException { + for(File file : files) { + if(name.equals(file.getName())) { + return file; + } + } + throw new FileNotFoundException("Искомый файл не существует."); } } diff --git a/src/com/walking/lesson20_exceptions/task1_catchException/file/File.java b/src/com/walking/lesson20_exceptions/task1_catchException/file/File.java new file mode 100644 index 000000000..383eec687 --- /dev/null +++ b/src/com/walking/lesson20_exceptions/task1_catchException/file/File.java @@ -0,0 +1,30 @@ +package com.walking.lesson20_exceptions.task1_catchException.file; + +public class File { + private final String name; + private final String size; + private final FileType type; + + public File(String name, String size, FileType type) { + this.name = name; + this.size = size; + this.type = type; + } + + public String getName() { + return name; + } + + public String getSize() { + return size; + } + + public FileType getType() { + return type; + } + + @Override + public String toString() { + return "Название файла: " + name + ".\nРазмер файла: " + size + ".\nТип файла: " + type.getName() + "."; + } +} diff --git a/src/com/walking/lesson20_exceptions/task1_catchException/file/FileType.java b/src/com/walking/lesson20_exceptions/task1_catchException/file/FileType.java new file mode 100644 index 000000000..2df950d41 --- /dev/null +++ b/src/com/walking/lesson20_exceptions/task1_catchException/file/FileType.java @@ -0,0 +1,18 @@ +package com.walking.lesson20_exceptions.task1_catchException.file; + +public enum FileType { + TEXT("текст"), + VIDEO("видеозапись"), + AUDIO("аудиозапись"), + PICTURE("изображение"); + + private final String name; + + FileType(String name) { + this.name = name; + } + + public String getName() { + return name; + } +} diff --git a/src/com/walking/lesson20_exceptions/task1_throwsException/Main.java b/src/com/walking/lesson20_exceptions/task1_throwsException/Main.java index 368d583c8..0a2463182 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.file.File; + +import java.io.FileNotFoundException; +import java.util.Scanner; + +import static com.walking.lesson20_exceptions.task1_throwsException.file.FileType.*; + /** * Создайте массив, имитирующий простейшую файловую систему и содержащий объекты файлов. *

@@ -16,6 +23,31 @@ * Подсказка: throws можно использовать в том числе в main(). */ public class Main { - public static void main(String[] args) { + public static void main(String[] args) throws FileNotFoundException { + File[] files = new File[8]; + files[0] = new File("Девятый вал", "109 КБ", PICTURE); + files[1] = new File("Шрек 2", "128 МБ", VIDEO); + files[2] = new File("Три товарища", "895 КБ", TEXT); + files[3] = new File("Эфир", "7.4 МБ", AUDIO); + files[4] = new File("Пока течёт река", "930 КБ", TEXT); + files[5] = new File("М", "8 МБ", AUDIO); + files[6] = new File("Душа", "134 МБ", VIDEO); + files[7] = new File("Смешной мем", "99 КБ", PICTURE); + + Scanner in = new Scanner(System.in); + System.out.print("Введите название файла: "); + String name = in.nextLine(); + + File file = findFile(files, name); + System.out.println(file); + } + + public static File findFile(File[] files, String name) throws FileNotFoundException { + for (File file : files) { + if (name.equals(file.getName())) { + return file; + } + } + throw new FileNotFoundException("Файл не найден!"); } } diff --git a/src/com/walking/lesson20_exceptions/task1_throwsException/file/File.java b/src/com/walking/lesson20_exceptions/task1_throwsException/file/File.java new file mode 100644 index 000000000..97cdc29e6 --- /dev/null +++ b/src/com/walking/lesson20_exceptions/task1_throwsException/file/File.java @@ -0,0 +1,30 @@ +package com.walking.lesson20_exceptions.task1_throwsException.file; + +public class File { + private final String name; + private final String size; + private final FileType type; + + public File(String name, String size, FileType type) { + this.name = name; + this.size = size; + this.type = type; + } + + public String getName() { + return name; + } + + public String getSize() { + return size; + } + + public FileType getType() { + return type; + } + + @Override + public String toString() { + return "Название файла: " + name + ".\nРазмер файла: " + size + ".\nТип файла: " + type.getName() + "."; + } +} diff --git a/src/com/walking/lesson20_exceptions/task1_throwsException/file/FileType.java b/src/com/walking/lesson20_exceptions/task1_throwsException/file/FileType.java new file mode 100644 index 000000000..7a7c8996a --- /dev/null +++ b/src/com/walking/lesson20_exceptions/task1_throwsException/file/FileType.java @@ -0,0 +1,18 @@ +package com.walking.lesson20_exceptions.task1_throwsException.file; + +public enum FileType { + TEXT("текст"), + VIDEO("видеозапись"), + AUDIO("аудиозапись"), + PICTURE("изображение"); + + private final String name; + + FileType(String name) { + this.name = name; + } + + public String getName() { + return name; + } +} diff --git a/src/com/walking/lesson20_exceptions/task2/Main.java b/src/com/walking/lesson20_exceptions/task2/Main.java index cccb443bf..047ebc1f5 100644 --- a/src/com/walking/lesson20_exceptions/task2/Main.java +++ b/src/com/walking/lesson20_exceptions/task2/Main.java @@ -1,5 +1,12 @@ package com.walking.lesson20_exceptions.task2; +import com.walking.lesson20_exceptions.task2.exception.InputValidationException; +import com.walking.lesson20_exceptions.task2.figure.RegularFigure; +import com.walking.lesson20_exceptions.task2.figure.Square; +import com.walking.lesson20_exceptions.task2.figure.Triangle; + +import java.util.Scanner; + /** * Реализуйте любой из вариантов Задачи 1 в уроке 16. * При некорректном вводе с клавиатуры выбрасывайте собственное исключение InputValidationException. @@ -8,6 +15,25 @@ * Предка исключения определите самостоятельно. */ public class Main { - public static void main(String[] args) { + public static void main(String[] args) throws InputValidationException { + Scanner in = new Scanner(System.in); + System.out.print("Введите длину стороны: "); + int length = in.nextInt(); + + if (length < 1) { + throw new InputValidationException("Длина должна быть больше 0"); + } + + in = new Scanner(System.in); // не уверена, что это правильно, но без этой строки не даёт название фигуры ввести + System.out.print("Введите тип фигуры: "); + String figureType = in.nextLine(); + + RegularFigure figure = switch (figureType.toLowerCase()) { + case Triangle.NAME -> new Triangle(length); + case Square.NAME -> new Square(length); + default -> throw new InputValidationException("Неизвестный тип фигуры"); + }; + + System.out.println(figure.getFigure()); } } diff --git a/src/com/walking/lesson20_exceptions/task2/exception/InputValidationException.java b/src/com/walking/lesson20_exceptions/task2/exception/InputValidationException.java new file mode 100644 index 000000000..b945c7ec4 --- /dev/null +++ b/src/com/walking/lesson20_exceptions/task2/exception/InputValidationException.java @@ -0,0 +1,7 @@ +package com.walking.lesson20_exceptions.task2.exception; + +public class InputValidationException extends RuntimeException { + public InputValidationException(String message) { + super(message); + } +} diff --git a/src/com/walking/lesson20_exceptions/task2/figure/RegularFigure.java b/src/com/walking/lesson20_exceptions/task2/figure/RegularFigure.java new file mode 100644 index 000000000..56147dacd --- /dev/null +++ b/src/com/walking/lesson20_exceptions/task2/figure/RegularFigure.java @@ -0,0 +1,17 @@ +package com.walking.lesson20_exceptions.task2.figure; + +public abstract class RegularFigure { + protected final String SPACE = " "; + protected final String NEXT_LINE_SYMBOL = "\n"; + private final int length; + + protected RegularFigure(int length) { + this.length = length; + } + + public abstract String getFigure(); + + public int getLength() { + return length; + } +} diff --git a/src/com/walking/lesson20_exceptions/task2/figure/Square.java b/src/com/walking/lesson20_exceptions/task2/figure/Square.java new file mode 100644 index 000000000..9cad15c8d --- /dev/null +++ b/src/com/walking/lesson20_exceptions/task2/figure/Square.java @@ -0,0 +1,29 @@ +package com.walking.lesson20_exceptions.task2.figure; + +public class Square extends RegularFigure { + public static final String NAME = "квадрат"; + + private final String HORIZONTAL = "-"; + private final String VERTICAL = "|"; + + public Square(int length) { + super(length); + } + + @Override + public String getFigure() { + String square = getHorizontalSide(); + for (int i = 0; i < getLength() - 2; i++) { + square += getVerticalSide(); + } + return square + getHorizontalSide(); + } + + private String getHorizontalSide() { + return SPACE + HORIZONTAL.repeat(getLength() - 2) + SPACE + NEXT_LINE_SYMBOL; + } + + private String getVerticalSide() { + return VERTICAL + SPACE.repeat(getLength() - 2) + VERTICAL + NEXT_LINE_SYMBOL; + } +} diff --git a/src/com/walking/lesson20_exceptions/task2/figure/Triangle.java b/src/com/walking/lesson20_exceptions/task2/figure/Triangle.java new file mode 100644 index 000000000..66f8ef477 --- /dev/null +++ b/src/com/walking/lesson20_exceptions/task2/figure/Triangle.java @@ -0,0 +1,37 @@ +package com.walking.lesson20_exceptions.task2.figure; + +public class Triangle extends RegularFigure { + public static final String NAME = "треугольник"; + + private final String RIGHT_SIDE = "\\"; + private final String LEFT_SIDE = "/"; + private final String BOTTOM_SIDE = "_"; + + + public Triangle(int length) { + super(length); + } + + @Override + public String getFigure() { + return getTriangle() + getBottomSide(); + } + + private String getBottomSide() { + return LEFT_SIDE + BOTTOM_SIDE.repeat(getLength()) + RIGHT_SIDE; + } + + private String getTriangle() { + int k = getLength() / 2; + int j = getLength() % 2; + + String triangle = ""; + for (int i = 0; i < getLength() / 2; i++) { + triangle += SPACE.repeat(k) + LEFT_SIDE + SPACE.repeat(j) + RIGHT_SIDE + NEXT_LINE_SYMBOL; + k--; + j += 2; + } + + return triangle; + } +} diff --git a/src/com/walking/lesson20_exceptions/task3/Main.java b/src/com/walking/lesson20_exceptions/task3/Main.java index 3b81b191c..263d81668 100644 --- a/src/com/walking/lesson20_exceptions/task3/Main.java +++ b/src/com/walking/lesson20_exceptions/task3/Main.java @@ -1,5 +1,12 @@ 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.animal.Animal; +import com.walking.lesson20_exceptions.task3.animal.Cat; +import com.walking.lesson20_exceptions.task3.animal.Cow; +import com.walking.lesson20_exceptions.task3.animal.Dog; + /** * Реализуйте любой из вариантов задачи в уроке 18. * Для ситуации, когда тип животного неизвестен, выбрасывайте собственное исключение UnknownAnimalException. @@ -10,6 +17,23 @@ * которое содержит информацию об индексе массива, содержащем null. */ public class Main { - public static void main(String[] args) { + public static void main(String[] args) throws ArrayValidationException, UnknownAnimalException { + Animal[] animals = new Animal[]{new Cat(), new Cow(), new Dog(), new Cow(), new Animal(""), null}; + for (int i = 0; i < animals.length; i++) { + if (!isValid(animals[i])) { + throw new ArrayValidationException("Object is expected at index: " + i); + } + + switch (animals[i]) { + case Cat cat -> cat.meow(); + case Dog dog -> dog.woof(); + case Cow cow -> cow.moo(); + case null, default -> throw new UnknownAnimalException("Unknown animal"); + } + } + } + + public static boolean isValid(Animal animal) { + return animal != null; } } diff --git a/src/com/walking/lesson20_exceptions/task3/animal/Animal.java b/src/com/walking/lesson20_exceptions/task3/animal/Animal.java new file mode 100644 index 000000000..0488ca76a --- /dev/null +++ b/src/com/walking/lesson20_exceptions/task3/animal/Animal.java @@ -0,0 +1,13 @@ +package com.walking.lesson20_exceptions.task3.animal; + +public class Animal { + protected final String sound; + + public Animal(String sound) { + this.sound = sound; + } + + public void sound() { + System.out.println(); + } +} diff --git a/src/com/walking/lesson20_exceptions/task3/animal/Cat.java b/src/com/walking/lesson20_exceptions/task3/animal/Cat.java new file mode 100644 index 000000000..37bc13d64 --- /dev/null +++ b/src/com/walking/lesson20_exceptions/task3/animal/Cat.java @@ -0,0 +1,12 @@ +package com.walking.lesson20_exceptions.task3.animal; + +public class Cat extends Animal { + + public Cat() { + super("meow"); + } + + public void meow() { + System.out.println(sound); + } +} diff --git a/src/com/walking/lesson20_exceptions/task3/animal/Cow.java b/src/com/walking/lesson20_exceptions/task3/animal/Cow.java new file mode 100644 index 000000000..b645420e1 --- /dev/null +++ b/src/com/walking/lesson20_exceptions/task3/animal/Cow.java @@ -0,0 +1,12 @@ +package com.walking.lesson20_exceptions.task3.animal; + +public class Cow extends Animal { + + public Cow() { + super("moo"); + } + + public void moo() { + System.out.println(sound); + } +} diff --git a/src/com/walking/lesson20_exceptions/task3/animal/Dog.java b/src/com/walking/lesson20_exceptions/task3/animal/Dog.java new file mode 100644 index 000000000..fd5022431 --- /dev/null +++ b/src/com/walking/lesson20_exceptions/task3/animal/Dog.java @@ -0,0 +1,12 @@ +package com.walking.lesson20_exceptions.task3.animal; + +public class Dog extends Animal { + + public Dog() { + super("woof"); + } + + public void woof() { + System.out.println(sound); + } +} 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..329d7515b --- /dev/null +++ b/src/com/walking/lesson20_exceptions/task3/exception/ArrayValidationException.java @@ -0,0 +1,8 @@ +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..ead86d85b --- /dev/null +++ b/src/com/walking/lesson20_exceptions/task3/exception/UnknownAnimalException.java @@ -0,0 +1,7 @@ +package com.walking.lesson20_exceptions.task3.exception; + +public class UnknownAnimalException extends RuntimeException { + public UnknownAnimalException(String message) { + super(message); + } +} diff --git a/src/com/walking/lesson21_immutable_object/Main.java b/src/com/walking/lesson21_immutable_object/Main.java index 6027e7453..17d9939b2 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.car.Car; +import com.walking.lesson21_immutable_object.car.CarIdentifier; +import com.walking.lesson21_immutable_object.car.CarService; + +import java.util.Scanner; + /** * Реализуйте задачу из урока 19. *

@@ -10,5 +16,28 @@ */ public class Main { public static void main(String[] args) { + + Car[] cars = new Car[6]; + cars[0] = new Car("Audi", "Печкин Ф.Б.", "уе777к"); + cars[1] = new Car("BMW", "Борисов Ю.А.", "ос025р"); + cars[2] = new Car("Ford", "Снегирь Ю.В.", "мр666м"); + cars[3] = new Car("Bentley", "Белова Д.М.", "ра345з"); + cars[4] = new Car("Ferrari", "Сергеев К.Л.", "уе999з"); + cars[5] = new Car("Москвич", "Попов А.Д.", "ар832с"); + + Scanner in = new Scanner(System.in); + System.out.print("Марка машины: "); + String brand = in.nextLine(); + System.out.print("Номер машины: "); + String number = in.nextLine(); + + Car car = new Car(new CarIdentifier(brand, number)); + car = CarService.find(cars, car); + + if (car == null) { + System.out.println("Машина не найдена!"); + } else { + System.out.println(car); + } } } diff --git a/src/com/walking/lesson21_immutable_object/car/Car.java b/src/com/walking/lesson21_immutable_object/car/Car.java new file mode 100644 index 000000000..ce38198fd --- /dev/null +++ b/src/com/walking/lesson21_immutable_object/car/Car.java @@ -0,0 +1,50 @@ +package com.walking.lesson21_immutable_object.car; + +public class Car { + private final CarIdentifier identifier; + private String owner; + + public Car(String brand, String owner, String number) { + this.identifier = new CarIdentifier(brand, number); + this.owner = owner; + } + + public Car(CarIdentifier identifier) { + this.identifier = identifier; + } + + @Override + public String toString() { + return identifier.getBrand() + ", " + owner + ", " + identifier.getNumber(); + } + + public CarIdentifier getIdentifier() { + return identifier; + } + + public String getOwner() { + return owner; + } + + public void setOwner(String owner) { + this.owner = owner; + } + + public boolean equals(Object car) { + if (this == car) { + return true; + } + + if (car == null) { + return false; + } + + if (!getClass().equals(car.getClass())) { + return false; + } + + Car c = (Car) car; + + return identifier.equals(c.identifier); + } +} diff --git a/src/com/walking/lesson21_immutable_object/car/CarIdentifier.java b/src/com/walking/lesson21_immutable_object/car/CarIdentifier.java new file mode 100644 index 000000000..51ed56339 --- /dev/null +++ b/src/com/walking/lesson21_immutable_object/car/CarIdentifier.java @@ -0,0 +1,47 @@ +package com.walking.lesson21_immutable_object.car; + +public final class CarIdentifier { + private final String brand; + private final String number; + + public CarIdentifier(String brand, String number) { + this.brand = brand; + this.number = number; + } + + @Override + public boolean equals(Object car) { + if (this == car) { + return true; + } + + if (car == null) { + return false; + } + + if (!getClass().equals(car.getClass())) { + return false; + } + + CarIdentifier c = (CarIdentifier) car; + + return number.equals(c.number) && brand.equals(c.brand); + } + + @Override + public int hashCode() { + int result = brand != null ? brand.hashCode() : 0; + result *= 31 + (number != null ? number.hashCode() : 0); + + return result; + } + + public String getBrand() { + return brand; + } + + public String getNumber() { + return number; + } + +} diff --git a/src/com/walking/lesson21_immutable_object/car/CarService.java b/src/com/walking/lesson21_immutable_object/car/CarService.java new file mode 100644 index 000000000..87721dbd5 --- /dev/null +++ b/src/com/walking/lesson21_immutable_object/car/CarService.java @@ -0,0 +1,13 @@ +package com.walking.lesson21_immutable_object.car; + +public class CarService { + + public static Car find(Car[] cars, Car car) { + for (Car c : cars) { + if (c.equals(car)) { + return c; + } + } + return null; + } +} 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..c3eba090d 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,5 +1,9 @@ package com.walking.lesson25_nested_classes.task1.anonymous_class; +import com.walking.lesson25_nested_classes.task1.anonymous_class.figure.RegularFigure; + +import java.util.Scanner; + /** * Реализуйте задачу * ... @@ -7,5 +11,65 @@ */ public class Main { public static void main(String[] args) { + Scanner in = new Scanner(System.in); + System.out.print("Введите тип фигуры: "); + String shape = in.nextLine(); + System.out.print("Введите длину стороны: "); + int length = in.nextInt(); + + if (length < 1) { + System.out.println("Некорректный ввод"); + return; + } + + System.out.println(getResult(length, shape)); + } + + public static String getResult(int length, String shape) { + RegularFigure figure; + + switch (shape.toLowerCase()) { + case "треугольник": + figure = getTriangle(length); + break; + case "квадрат": + figure = getSquare(length); + break; + default: + throw new RuntimeException("Unknown shape"); + } + return figure.getFigure(); + } + + public static RegularFigure getTriangle(int length) { + return new RegularFigure() { + @Override + public String getFigure() { + int k = length / 2; + int j = length % 2; + + String triangle1 = ""; + for (int i = 0; i < length / 2; i++) { + triangle1 += SPACE.repeat(k) + LEFT_SIDE + SPACE.repeat(j) + RIGHT_SIDE + NEXT_LINE_SYMBOL; + k--; + j += 2; + } + return triangle1 + LEFT_SIDE + BOTTOM_SIDE.repeat(length) + RIGHT_SIDE; + } + }; + } + + public static RegularFigure getSquare(int length) { + return new RegularFigure() { + @Override + public String getFigure() { + String horizontal = SPACE + HORIZONTAL.repeat(length - 2) + SPACE + NEXT_LINE_SYMBOL; + String square = horizontal; + for (int i = 0; i < length - 2; i++) { + square += VERTICAL + SPACE.repeat(length - 2) + VERTICAL + NEXT_LINE_SYMBOL; + } + return square + horizontal; + } + }; } } diff --git a/src/com/walking/lesson25_nested_classes/task1/anonymous_class/figure/RegularFigure.java b/src/com/walking/lesson25_nested_classes/task1/anonymous_class/figure/RegularFigure.java new file mode 100644 index 000000000..71d8e2694 --- /dev/null +++ b/src/com/walking/lesson25_nested_classes/task1/anonymous_class/figure/RegularFigure.java @@ -0,0 +1,13 @@ +package com.walking.lesson25_nested_classes.task1.anonymous_class.figure; + +public interface RegularFigure { + String SPACE = " "; + String NEXT_LINE_SYMBOL = "\n"; + String HORIZONTAL = "-"; + String VERTICAL = "|"; + String RIGHT_SIDE = "\\"; + String LEFT_SIDE = "/"; + String BOTTOM_SIDE = "_"; + + String getFigure(); +} 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..dac9cbf75 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,5 +1,9 @@ package com.walking.lesson25_nested_classes.task1.inner_class; +import com.walking.lesson25_nested_classes.task1.inner_class.figure.RegularFigure; + +import java.util.Scanner; + /** * Реализуйте задачу * ... @@ -7,5 +11,89 @@ */ public class Main { public static void main(String[] args) { + Scanner in = new Scanner(System.in); + System.out.print("Введите тип фигуры: "); + String shape = in.nextLine(); + System.out.print("Введите длину стороны: "); + int length = in.nextInt(); + + if (length < 1) { + System.out.println("Некорректный ввод"); + return; + } + + System.out.println(createFigure(length, shape)); + } + + public static String createFigure(int length, String shape) { + Main main = new Main(); + RegularFigure figure = switch (shape.toLowerCase()) { + case "треугольник" -> main.new Triangle(length); + case "квадрат" -> main.new Square(length); + default -> throw new RuntimeException("Неизвестная фигура"); + }; + + return figure.getFigure(); + } + + private class Square implements RegularFigure { + private final String HORIZONTAL = "-"; + private final String VERTICAL = "|"; + private final int length; + + private Square(int length) { + this.length = length; + } + + @Override + public String getFigure() { + String square = getHorizontalSide(); + for (int i = 0; i < length - 2; i++) { + square += getVerticalSide(); + } + return square + getHorizontalSide(); + } + + private String getHorizontalSide() { + return SPACE + HORIZONTAL.repeat(length - 2) + SPACE + NEXT_LINE_SYMBOL; + } + + private String getVerticalSide() { + return VERTICAL + SPACE.repeat(length - 2) + VERTICAL + NEXT_LINE_SYMBOL; + } + } + + private class Triangle implements RegularFigure { + String RIGHT_SIDE = "\\"; + String LEFT_SIDE = "/"; + String BOTTOM_SIDE = "_"; + private final int length; + + private Triangle(int length) { + this.length = length; + } + + @Override + public String getFigure() { + return getSides() + getBottomSide(); + } + + private String getBottomSide() { + return LEFT_SIDE + BOTTOM_SIDE.repeat(length) + RIGHT_SIDE; + } + + private String getSides() { + int k = length / 2; + int j = length % 2; + + String triangle = ""; + for (int i = 0; i < length / 2; i++) { + triangle += SPACE.repeat(k) + LEFT_SIDE + SPACE.repeat(j) + RIGHT_SIDE + NEXT_LINE_SYMBOL; + k--; + j += 2; + } + + return triangle; + } } } diff --git a/src/com/walking/lesson25_nested_classes/task1/inner_class/figure/RegularFigure.java b/src/com/walking/lesson25_nested_classes/task1/inner_class/figure/RegularFigure.java new file mode 100644 index 000000000..119cf2418 --- /dev/null +++ b/src/com/walking/lesson25_nested_classes/task1/inner_class/figure/RegularFigure.java @@ -0,0 +1,8 @@ +package com.walking.lesson25_nested_classes.task1.inner_class.figure; + +public interface RegularFigure { + String SPACE = " "; + String NEXT_LINE_SYMBOL = "\n"; + + String getFigure(); +} 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..e09475143 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,5 +1,9 @@ package com.walking.lesson25_nested_classes.task1.static_class; +import com.walking.lesson25_nested_classes.task1.static_class.figure.RegularFigure; + +import java.util.Scanner; + /** * Реализуйте задачу * ... @@ -7,5 +11,73 @@ */ public class Main { public static void main(String[] args) { + Scanner in = new Scanner(System.in); + System.out.print("Введите тип фигуры: "); + String figureType = in.nextLine(); + System.out.print("Введите длину стороны: "); + int length = in.nextInt(); + + if (length < 1) { + System.out.println("Некорректный ввод"); + return; + } + + System.out.println(getFigure(figureType).getFigure(length)); + } + + public static RegularFigure getFigure(String figureType) { + return switch (figureType.toLowerCase()) { + case "треугольник" -> new Triangle(); + case "квадрат" -> new Square(); + default -> new Unknown(); + }; + } + + private static class Square implements RegularFigure { + public String getFigure(int length) { + String square = getHorizontalSide(length); + for (int i = 0; i < length - 2; i++) { + square += getVerticalSide(length); + } + return square + getHorizontalSide(length); + } + + private String getHorizontalSide(int length) { + return SPACE + HORIZONTAL.repeat(length - 2) + SPACE + NEXT_LINE_SYMBOL; + } + + private String getVerticalSide(int length) { + return VERTICAL + SPACE.repeat(length - 2) + VERTICAL + NEXT_LINE_SYMBOL; + } + } + + private static class Triangle implements RegularFigure { + public String getFigure(int length) { + return getTriangle(length) + getBottomSide(length); + } + + private String getBottomSide(int length) { + return LEFT_SIDE + BOTTOM_SIDE.repeat(length) + RIGHT_SIDE; + } + + private String getTriangle(int length) { + int k = length / 2; + int j = length % 2; + + String triangle = ""; + for (int i = 0; i < length / 2; i++) { + triangle += SPACE.repeat(k) + LEFT_SIDE + SPACE.repeat(j) + RIGHT_SIDE + NEXT_LINE_SYMBOL; + k--; + j += 2; + } + + return triangle; + } + } + + static class Unknown implements RegularFigure { + public String getFigure(int length) { + return "Неизвестная фигура"; + } } } diff --git a/src/com/walking/lesson25_nested_classes/task1/static_class/figure/RegularFigure.java b/src/com/walking/lesson25_nested_classes/task1/static_class/figure/RegularFigure.java new file mode 100644 index 000000000..7f0854ede --- /dev/null +++ b/src/com/walking/lesson25_nested_classes/task1/static_class/figure/RegularFigure.java @@ -0,0 +1,13 @@ +package com.walking.lesson25_nested_classes.task1.static_class.figure; + +public interface RegularFigure { + String SPACE = " "; + String NEXT_LINE_SYMBOL = "\n"; + String HORIZONTAL = "-"; + String VERTICAL = "|"; + String RIGHT_SIDE = "\\"; + String LEFT_SIDE = "/"; + String BOTTOM_SIDE = "_"; + + String getFigure(int length); +} 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..2d17d3ae5 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,5 +1,7 @@ package com.walking.lesson25_nested_classes.task2.anonymous_class; +import com.walking.lesson25_nested_classes.task2.anonymous_class.animal.Animal; + /** * Реализуйте задачу * ... @@ -7,5 +9,34 @@ */ 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("woof"); + } + }, new Animal() { + @Override + public void sound() { + System.out.println("moo"); + } + }, new Animal() { + @Override + public void sound() { + System.out.println("meow"); + } + }}; + + soundAll(animals); + } + + private static void soundAll(Animal[] animals) { + for (Animal animal : animals) { + animal.sound(); + } } } diff --git a/src/com/walking/lesson25_nested_classes/task2/anonymous_class/animal/Animal.java b/src/com/walking/lesson25_nested_classes/task2/anonymous_class/animal/Animal.java new file mode 100644 index 000000000..c07ac6777 --- /dev/null +++ b/src/com/walking/lesson25_nested_classes/task2/anonymous_class/animal/Animal.java @@ -0,0 +1,8 @@ +package com.walking.lesson25_nested_classes.task2.anonymous_class.animal; + +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..809ec2d6e 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.animal.Animal; + /** * Реализуйте задачу * ... @@ -7,5 +9,36 @@ */ 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); + } + + public static void soundAll(Animal[] animals) { + for(Animal animal : animals) { + animal.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/animal/Animal.java b/src/com/walking/lesson25_nested_classes/task2/inner_class/animal/Animal.java new file mode 100644 index 000000000..426db7251 --- /dev/null +++ b/src/com/walking/lesson25_nested_classes/task2/inner_class/animal/Animal.java @@ -0,0 +1,9 @@ +package com.walking.lesson25_nested_classes.task2.inner_class.animal; + +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..8a31e0f6d 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.animal.Animal; + /** * Реализуйте задачу * ... @@ -7,5 +9,35 @@ */ public class Main { public static void main(String[] args) { + Animal[] animals = new Animal[]{new Cat(), new Cow(), new Dog(), new Cow(), new Animal()}; + + soundAll(animals); + } + + public static void soundAll(Animal[] animals) { + for (Animal animal : animals) { + animal.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/animal/Animal.java b/src/com/walking/lesson25_nested_classes/task2/static_class/animal/Animal.java new file mode 100644 index 000000000..0436d826c --- /dev/null +++ b/src/com/walking/lesson25_nested_classes/task2/static_class/animal/Animal.java @@ -0,0 +1,9 @@ +package com.walking.lesson25_nested_classes.task2.static_class.animal; + +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..fefcd9f50 100644 --- a/src/com/walking/lesson26_string_types/task1/Main.java +++ b/src/com/walking/lesson26_string_types/task1/Main.java @@ -1,5 +1,10 @@ package com.walking.lesson26_string_types.task1; +import com.walking.lesson26_string_types.task1.service.Rectangle; +import com.walking.lesson26_string_types.task1.service.UnexpectedNumberException; + +import java.util.Scanner; + /** * Реализуйте задачу * ... @@ -7,5 +12,23 @@ */ public class Main { public static void main(String[] args) { + Scanner in = new Scanner(System.in); + + int length = getNumber(in, "Введите длину: "); + int width = getNumber(in, "Введите ширину: "); + + Rectangle rectangle = new Rectangle(length, width); + System.out.println(rectangle.getRectangle()); + } + + public static int getNumber(Scanner in, String message) throws UnexpectedNumberException { + System.out.print(message); + int num = in.nextInt(); + + if (num > 0) { + return num; + } + + throw new UnexpectedNumberException("Число должно быть больше 0"); } } diff --git a/src/com/walking/lesson26_string_types/task1/service/Rectangle.java b/src/com/walking/lesson26_string_types/task1/service/Rectangle.java new file mode 100644 index 000000000..a6dbbd6e8 --- /dev/null +++ b/src/com/walking/lesson26_string_types/task1/service/Rectangle.java @@ -0,0 +1,59 @@ +package com.walking.lesson26_string_types.task1.service; + +public class Rectangle { + private final String SPACE = " "; + private final String LENGTH_SYMBOL = "-"; + private final String WIDTH_SYMBOL = "|"; + + private int length; + private int width; + + public Rectangle(int length, int width) { + this.length = length; + this.width = width; + } + + /** + * как я поняла, StringBuilder быстрее работает, + * а плюсы StringBuffer'а только в условиях многопоточности раскрываются, что, вроде, не про эту задачу. + * поэтому использовала StringBuilder + * P.S. может, перемудрила с классами, но мне захотелось попробовать поприменять из прошлых уроков штуки:) + */ + + public StringBuilder getRectangle() { + StringBuilder rectangle = getLine(SPACE, LENGTH_SYMBOL); + + for (int i = 0; i < width - 2; i++) { + rectangle.append(getLine(WIDTH_SYMBOL, SPACE)); + } + + return rectangle.append(getLine(SPACE, LENGTH_SYMBOL)); + } + + private StringBuilder getLine(String side, String center) { + StringBuilder horizontal = new StringBuilder(side); + for (int i = 0; i < length - 2; i++) { + horizontal.append(center); + } + + return horizontal + .append(side) + .append("\n"); + } + + public int getLength() { + return length; + } + + public void setLength(int length) { + this.length = length; + } + + public int getWidth() { + return width; + } + + public void setWidth(int width) { + this.width = width; + } +} diff --git a/src/com/walking/lesson26_string_types/task1/service/UnexpectedNumberException.java b/src/com/walking/lesson26_string_types/task1/service/UnexpectedNumberException.java new file mode 100644 index 000000000..16038e851 --- /dev/null +++ b/src/com/walking/lesson26_string_types/task1/service/UnexpectedNumberException.java @@ -0,0 +1,7 @@ +package com.walking.lesson26_string_types.task1.service; + +public class UnexpectedNumberException extends RuntimeException { + public UnexpectedNumberException(String message) { + super(message); + } +} diff --git a/src/com/walking/lesson26_string_types/task2/Main.java b/src/com/walking/lesson26_string_types/task2/Main.java index 7f272e617..78f5c291b 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,42 @@ */ public class Main { public static void main(String[] args) { + Scanner in = new Scanner(System.in); + System.out.print("Введите фразу: "); + String phrase = in.nextLine(); + + System.out.printf("Найдено уникальных слов: %d", countWords(splitPhrase(phrase))); + } + + public static String[] splitPhrase(String phrase) { + return phrase.trim() + .toLowerCase() + .split(" "); + } + + public static int countWords(String[] phrase) { + int counter = 0; + boolean isEqual; + for (int i = 0; i < phrase.length; i++) { + isEqual = isUnique(phrase, i); + + if (!isEqual) { + counter--; + } + + counter++; + } + + return counter; + } + + public static boolean isUnique(String[] phrase, int num) { + for (int i = num + 1; i < phrase.length; i++) { + if (phrase[num].equals(phrase[i])) { + return false; + } + } + + return true; } } diff --git a/src/com/walking/lesson28_generics1/task1/Main.java b/src/com/walking/lesson28_generics1/task1/Main.java index 0455c9bea..68a63c849 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.model.GenericNumber; + /** * Создать обобщенный тип, принимающий в себя любого из наследников Number. * Создать метод, возводящий значение параметризованного типа в степень, @@ -7,5 +9,12 @@ */ public class Main { public static void main(String[] args) { + GenericNumber intNum = new GenericNumber<>(); + intNum.setNum(11); + System.out.println(intNum.getPow(3)); + + GenericNumber longNum = new GenericNumber<>(); + longNum.setNum(654L); + System.out.println(longNum.getPow(2)); } } diff --git a/src/com/walking/lesson28_generics1/task1/model/GenericNumber.java b/src/com/walking/lesson28_generics1/task1/model/GenericNumber.java new file mode 100644 index 000000000..648a3a251 --- /dev/null +++ b/src/com/walking/lesson28_generics1/task1/model/GenericNumber.java @@ -0,0 +1,19 @@ +package com.walking.lesson28_generics1.task1.model; + +public class GenericNumber { + private T num; + + public void setNum(T num) { + this.num = num; + } + + public T getNum() { + return num; + } + + public double getPow(double pow) { + double number = num.doubleValue(); + + return Math.pow(number, pow); + } +} diff --git a/src/com/walking/lesson28_generics1/task2/Main.java b/src/com/walking/lesson28_generics1/task2/Main.java index 7f16bed5e..fa461bca8 100644 --- a/src/com/walking/lesson28_generics1/task2/Main.java +++ b/src/com/walking/lesson28_generics1/task2/Main.java @@ -1,10 +1,24 @@ package com.walking.lesson28_generics1.task2; +import com.walking.lesson28_generics1.task2.model.GenericObject; + /** * Создать класс-обертку над объектом любого типа. * Предусмотреть boolean-метод, проверяющий значение объекта на null. */ public class Main { public static void main(String[] args) { + GenericObject stringObj = new GenericObject<>("Hello"); + GenericObject numberObj = new GenericObject<>(null); + print(stringObj); + print(numberObj); + } + + public static void print(GenericObject object) { + if (object.isNull()) { + throw new RuntimeException("Object is null"); + } + + System.out.println(object.get()); } } diff --git a/src/com/walking/lesson28_generics1/task2/model/GenericObject.java b/src/com/walking/lesson28_generics1/task2/model/GenericObject.java new file mode 100644 index 000000000..d63266fa2 --- /dev/null +++ b/src/com/walking/lesson28_generics1/task2/model/GenericObject.java @@ -0,0 +1,17 @@ +package com.walking.lesson28_generics1.task2.model; + +public class GenericObject { + private final T obj; + + public GenericObject(T obj) { + this.obj = obj; + } + + public boolean isNull() { + return obj == null; + } + + public T get() { + return obj; + } +} diff --git a/src/com/walking/lesson28_generics1/task3/Main.java b/src/com/walking/lesson28_generics1/task3/Main.java index 0fb329432..6e1afbeac 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.model.GenericArray; + /** * Реализовать класс для работы с массивом. * Разработать метод, производящий поиск значения в массиве. @@ -8,5 +10,9 @@ */ public class Main { public static void main(String[] args) { + Character[] arr = new Character[] {'a', 'r', 't', '2', 'y', 'u', '-'}; + GenericArray charArr = new GenericArray<>(arr); + System.out.println(charArr.find('y')); + System.out.println(charArr.find('i')); } } diff --git a/src/com/walking/lesson28_generics1/task3/model/GenericArray.java b/src/com/walking/lesson28_generics1/task3/model/GenericArray.java new file mode 100644 index 000000000..37ebc689c --- /dev/null +++ b/src/com/walking/lesson28_generics1/task3/model/GenericArray.java @@ -0,0 +1,22 @@ +package com.walking.lesson28_generics1.task3.model; + +public class GenericArray { + private final T[] arr; + + public GenericArray(T[] arr) { + this.arr = arr; + } + + public T[] get() { + return arr; + } + + public T find(T object) { + for (T obj : arr) { + if (obj.equals(object)) { + return obj; + } + } + throw new RuntimeException("Элемент не найден"); + } +} diff --git a/src/com/walking/lesson29_generics2/task1/Main.java b/src/com/walking/lesson29_generics2/task1/Main.java index 70bf6cf88..f07af6fd0 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 genericString = new Generic<>("Hello"); + System.out.println(getSmth(genericString, "Okay")); + Generic genericInt = new Generic<>(null); + System.out.println(getSmth(genericInt, 8)); + } + + public static T getSmth(Generic generic, T object) { + T genericObject = generic.getObject(); + if (genericObject == null) { + return object; + } + + return genericObject; } } 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..083736af3 --- /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 object; + + public Generic(T object) { + this.object = object; + } + + public T getObject() { + return object; + } +} diff --git a/src/com/walking/lesson29_generics2/task2/Main.java b/src/com/walking/lesson29_generics2/task2/Main.java index 5a81839d8..0e518129e 100644 --- a/src/com/walking/lesson29_generics2/task2/Main.java +++ b/src/com/walking/lesson29_generics2/task2/Main.java @@ -1,5 +1,8 @@ package com.walking.lesson29_generics2.task2; + +import com.walking.lesson29_generics2.task2.model.GenericNumber; + /** * Используя Задачу 1 из урока Generics. * Часть I, реализуйте в Main метод, принимающий аргументом объект подходящего @@ -8,5 +11,14 @@ */ public class Main { public static void main(String[] args) { + GenericNumber num = getGeneric(7); + System.out.println(num.getPow(3)); + + num = getGeneric(654L); + System.out.println(num.getPow(2)); + } + + public static GenericNumber getGeneric(Number num) { + return new GenericNumber<>(num); } } diff --git a/src/com/walking/lesson29_generics2/task2/model/GenericNumber.java b/src/com/walking/lesson29_generics2/task2/model/GenericNumber.java new file mode 100644 index 000000000..31f3abf2f --- /dev/null +++ b/src/com/walking/lesson29_generics2/task2/model/GenericNumber.java @@ -0,0 +1,19 @@ +package com.walking.lesson29_generics2.task2.model; + +public class GenericNumber { + private final T num; + + public GenericNumber(T num) { + this.num = num; + } + + public T getNum() { + return num; + } + + public double getPow(double pow) { + double number = num.doubleValue(); + + return Math.pow(number, pow); + } +} diff --git a/src/com/walking/lesson30_regex/task1easy/Main.java b/src/com/walking/lesson30_regex/task1easy/Main.java index 6a988bb7e..efa1a32e3 100644 --- a/src/com/walking/lesson30_regex/task1easy/Main.java +++ b/src/com/walking/lesson30_regex/task1easy/Main.java @@ -1,5 +1,8 @@ package com.walking.lesson30_regex.task1easy; +import java.util.Scanner; +import java.util.regex.Pattern; + /** * Реализуйте boolean-метод, валидирующий входящую строку. * Метод должен возвращать true, @@ -12,5 +15,19 @@ */ public class Main { public static void main(String[] args) { + String regex = "^\\+7 \\(\\d{3}\\) \\d{3}-\\d{2}-\\d{2}$"; + Scanner in = new Scanner(System.in); + System.out.print("Введите номер телефона: "); + String number = in.nextLine(); + + if (isPhoneNumber(number, regex)) { + System.out.println("Всё верно."); + } else { + throw new RuntimeException("Ошибка в данных."); + } + } + + public static boolean isPhoneNumber(String number, String regex) { + return Pattern.matches(regex, number); } } diff --git a/src/com/walking/lesson30_regex/task1hard/Main.java b/src/com/walking/lesson30_regex/task1hard/Main.java index 3480d69c3..e190d12a6 100644 --- a/src/com/walking/lesson30_regex/task1hard/Main.java +++ b/src/com/walking/lesson30_regex/task1hard/Main.java @@ -1,5 +1,8 @@ package com.walking.lesson30_regex.task1hard; +import java.util.Scanner; +import java.util.regex.Pattern; + /** * Реализуйте boolean-метод, валидирующий входящую строку. * Метод должен возвращать true, @@ -16,5 +19,41 @@ */ public class Main { public static void main(String[] args) { + String regex = "^\\+7 ?\\(?\\d{3}\\)? ?\\d{3}-?\\d{2}-?\\d{2}$"; + Scanner in = new Scanner(System.in); + System.out.print("Введите номер телефона: "); + String number = in.nextLine(); + + if (isPhoneNumber(number, regex)) { + System.out.println("Всё верно."); + } else { + throw new RuntimeException("Ошибка в данных."); + } + } + + public static boolean isPhoneNumber(String number, String regex) { + return Pattern.matches(regex, number) + && isValidSpase(number) && isValidBrackets(number) && isValidHyphens(number); + } + + private static boolean isValidSpase(String number) { + if (number.contains(" ")) { + return number.matches("\\S+ \\S+ \\S+"); + } + return true; + } + + private static boolean isValidBrackets(String number) { + if (number.contains("(") || number.contains(")")) { + return number.matches("[^()]+\\([^()]+\\)[^()]+"); + } + return true; + } + + private static boolean isValidHyphens(String number) { + if (number.contains("-")) { + return number.matches("[^-]+-[^-]+-[^-]+"); + } + return true; } } diff --git a/src/com/walking/lesson30_regex/task2/Main.java b/src/com/walking/lesson30_regex/task2/Main.java index c101f97f4..a8a79c332 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.exeption.InvalidFullNameException; +import com.walking.lesson30_regex.task2.service.FullName; + +import java.util.Scanner; + /** * Реализуйте метод для работы с ФИО. * Входным параметром должна являться строка, @@ -13,6 +18,54 @@ * Если невалидна – бросьте из метода исключение, указывающее на ошибку валидации. */ public class Main { + private static final String FULL_NAME_REGEX = "[А-Я][А-Яа-я-]* [А-Яа-я]* [А-Яа-я]*"; + private static final String NAME_REGEX = "[А-Я][а-я]*"; + private static final String DOUBLE_SURNAME_REGEX = "[А-Я][а-я]*-[А-Я][а-я]*"; + public static void main(String[] args) { + Scanner in = new Scanner(System.in); + System.out.print("Введите имя: "); + String fullName = in.nextLine(); + getFullName(fullName).printFullName(); + } + + public static FullName getFullName(String fullName) { + if (!isFullNameValid(fullName)) { + throw new InvalidFullNameException("Полное имя указано некорректно."); + } + String[] fullNameArr = fullName.split(" "); + String surname = fullNameArr[0]; + String name = fullNameArr[1]; + String patronymic = fullNameArr[2]; + + if (!isSurnameValid(surname)) { + throw new InvalidFullNameException("Фамилия указана некорректно: " + surname); + } + + if (!isNameValid(name)) { + throw new InvalidFullNameException("Имя указано некорректно: " + name); + } + + if (!isNameValid(patronymic)) { + throw new InvalidFullNameException("Отчество указано некорректно: " + patronymic); + } + + return new FullName(surname, name, patronymic); + } + + public static boolean isFullNameValid(String fullName) { + return fullName.matches(FULL_NAME_REGEX); + } + + public static boolean isSurnameValid(String surname) { + if (surname.matches(DOUBLE_SURNAME_REGEX)) { + return true; + } + + return isNameValid(surname); + } + + public static boolean isNameValid(String name) { + return name.matches(NAME_REGEX); } } diff --git a/src/com/walking/lesson30_regex/task2/exeption/InvalidFullNameException.java b/src/com/walking/lesson30_regex/task2/exeption/InvalidFullNameException.java new file mode 100644 index 000000000..8a6aa606e --- /dev/null +++ b/src/com/walking/lesson30_regex/task2/exeption/InvalidFullNameException.java @@ -0,0 +1,7 @@ +package com.walking.lesson30_regex.task2.exeption; + +public class InvalidFullNameException extends RuntimeException { + public InvalidFullNameException(String message) { + super(message); + } +} diff --git a/src/com/walking/lesson30_regex/task2/service/FullName.java b/src/com/walking/lesson30_regex/task2/service/FullName.java new file mode 100644 index 000000000..4dfba3009 --- /dev/null +++ b/src/com/walking/lesson30_regex/task2/service/FullName.java @@ -0,0 +1,29 @@ +package com.walking.lesson30_regex.task2.service; + +public class FullName { + private final String name; + private final String surname; + private final String patronymic; + + public FullName(String surname, String name, String patronymic) { + this.name = name; + this.surname = surname; + this.patronymic = patronymic; + } + + public String getName() { + return name; + } + + public String getSurname() { + return surname; + } + + public String getPatronymic() { + return patronymic; + } + + public void printFullName() { + System.out.println(surname + " " + name + " " + patronymic); + } +} diff --git a/src/com/walking/lesson30_regex/task3/Main.java b/src/com/walking/lesson30_regex/task3/Main.java index 2af6da998..986d27d7b 100644 --- a/src/com/walking/lesson30_regex/task3/Main.java +++ b/src/com/walking/lesson30_regex/task3/Main.java @@ -1,5 +1,9 @@ package com.walking.lesson30_regex.task3; +import com.walking.lesson30_regex.task3.exception.InvalidWordException; + +import java.util.Scanner; + /** * Реализуйте задачу * ... @@ -12,6 +16,69 @@ * должно быть выброшено исключение. */ public class Main { + private static final String WORD = "[а-яa-z]+"; + private static final String WORD_WITH_HYPHENS = "[а-яa-z][а-яa-z-]+[а-яa-z]"; + public static void main(String[] args) { + Scanner in = new Scanner(System.in); + System.out.print("Введите фразу: "); + String phrase = in.nextLine() + .trim() + .toLowerCase(); + + String[] words = splitPhrase(phrase); + validateWords(words); + System.out.printf("Найдено уникальных слов: %d", countWords(words)); + + } + + public static int countWords(String[] phrase) { + int counter = 0; + boolean isEqual; + for (int i = 0; i < phrase.length; i++) { + isEqual = isUnique(phrase, i); + + if (!isEqual) { + counter--; + } + + counter++; + } + + return counter; + } + + public static void validateWords(String[] words) { + for (String word : words) { + if (!isWordValid(word)) { + throw new InvalidWordException("Некорректное слово: " + word); + } + } + } + + public static boolean isWordValid(String word) { + if (!word.contains("-")) { + return word.matches(WORD); + } + + if (word.matches("^.*--+.*$")) { + return false; + } + + return word.matches(WORD_WITH_HYPHENS); + } + + public static boolean isUnique(String[] phrase, int num) { + for (int i = num + 1; i < phrase.length; i++) { + if (phrase[num].equals(phrase[i])) { + return false; + } + } + + return true; + } + + private static String[] splitPhrase(String phrase) { + return phrase.split("\\s+"); } } diff --git a/src/com/walking/lesson30_regex/task3/exception/InvalidWordException.java b/src/com/walking/lesson30_regex/task3/exception/InvalidWordException.java new file mode 100644 index 000000000..58d7d5bab --- /dev/null +++ b/src/com/walking/lesson30_regex/task3/exception/InvalidWordException.java @@ -0,0 +1,7 @@ +package com.walking.lesson30_regex.task3.exception; + +public class InvalidWordException extends RuntimeException { + public InvalidWordException(String message) { + super(message); + } +} diff --git a/src/com/walking/lesson31_io_streams/Main.java b/src/com/walking/lesson31_io_streams/Main.java index 3d058d910..0602cf386 100644 --- a/src/com/walking/lesson31_io_streams/Main.java +++ b/src/com/walking/lesson31_io_streams/Main.java @@ -1,9 +1,68 @@ package com.walking.lesson31_io_streams; +import com.walking.lesson31_io_streams.exeption.WrongTypeExeption; + +import java.io.IOException; +import java.io.InputStreamReader; +import java.io.Reader; + /** * Чтение данных с помощью System.in и приведение к примитивным типам или строкам */ public class Main { - public static void main(String[] args) { + public static void main(String[] args) throws IOException { + System.out.println(readString()); + System.out.println(readBoolean()); + System.out.println(readChar()); + System.out.println(readByte()); + System.out.println(readInt()); + } + + public static byte readByte() throws IOException { + return Byte.parseByte(readString()); + } + + public static int readInt() throws IOException { + return Integer.parseInt(readString()); + } + + public static char readChar() throws IOException { + String string = readString(); + + if (string.length() == 1 || string.length() == 2 && string.charAt(1) == '\n') { + return string.charAt(0); + } + throw new WrongTypeExeption("\"%s\" не может быть представлено в виде символа".formatted(string)); + } + + public static boolean readBoolean() throws IOException { + String string = readString(); + + if ("false".equalsIgnoreCase(string)) { + return false; + } + + if ("true".equalsIgnoreCase(string)) { + return true; + } + throw new WrongTypeExeption("\"%s\" не похоже на boolean".formatted(string)); + } + + public static String readString() throws IOException { + StringBuilder stringBuilder = new StringBuilder(); + Reader reader = new InputStreamReader(System.in); + boolean isFinished = false; + + while (!isFinished) { + char ch = (char) reader.read(); + + if (ch == '\n') { + isFinished = true; + } else { + stringBuilder.append(ch); + } + } + + return stringBuilder.toString(); } } diff --git a/src/com/walking/lesson31_io_streams/exeption/WrongTypeExeption.java b/src/com/walking/lesson31_io_streams/exeption/WrongTypeExeption.java new file mode 100644 index 000000000..5533023e6 --- /dev/null +++ b/src/com/walking/lesson31_io_streams/exeption/WrongTypeExeption.java @@ -0,0 +1,7 @@ +package com.walking.lesson31_io_streams.exeption; + +public class WrongTypeExeption extends RuntimeException { + public WrongTypeExeption(String message) { + super(message); + } +} diff --git a/src/com/walking/lesson32_files_1/task1/Main.java b/src/com/walking/lesson32_files_1/task1/Main.java index 17fafb884..5dd242f98 100644 --- a/src/com/walking/lesson32_files_1/task1/Main.java +++ b/src/com/walking/lesson32_files_1/task1/Main.java @@ -1,11 +1,41 @@ package com.walking.lesson32_files_1.task1; +import com.walking.lesson19_object_methods.car.Car; + +import java.io.FileOutputStream; +import java.io.IOException; + /** * Используя класс Car (или создав новый класс для сущности «машина», на ваше усмотрение) из задачи * ... * Реализуйте сохранение массива машин в файл carCatalog.txt */ public class Main { - public static void main(String[] args) { + public static final String FILE_LOCATION = "./resources/carCatalog.txt"; + + public static void main(String[] args) throws IOException { + Car[] cars = new Car[6]; + cars[0] = new Car("Audi", "Печкин Ф.Б.", "уе777к"); + cars[1] = new Car("BMW", "Борисов Ю.А.", "ос025р"); + cars[2] = new Car("Ford", "Снегирь Ю.В.", "мр666м"); + cars[3] = new Car("Bentley", "Белова Д.М.", "ра345з"); + cars[4] = new Car("Ferrari", "Сергеев К.Л.", "уе999з"); + cars[5] = new Car("Москвич", "Попов А.Д.", "ар832с"); + + saveCars(cars); + } + + public static void saveCars(Car[] cars) throws IOException { + try (FileOutputStream fos = new FileOutputStream(FILE_LOCATION)) { + for (Car car : cars) { + String carInfo = car.toString() + "\n"; + byte[] bytes = carInfo.getBytes(); + fos.write(bytes, 0, bytes.length); + } + System.out.println("Файл записан."); + + } catch (IOException ex) { + throw new RuntimeException("Не удалось записать файл", ex); + } } } diff --git a/src/com/walking/lesson32_files_1/task2/Main.java b/src/com/walking/lesson32_files_1/task2/Main.java index b3fb29921..f1030ccc7 100644 --- a/src/com/walking/lesson32_files_1/task2/Main.java +++ b/src/com/walking/lesson32_files_1/task2/Main.java @@ -1,10 +1,54 @@ package com.walking.lesson32_files_1.task2; +import com.walking.lesson19_object_methods.car.Car; + +import java.io.FileReader; +import java.io.IOException; +import java.util.Scanner; + /** * Используя Задачу 1, реализуйте чтение из carCatalog.txt, * реализовав сохранение данных в массив Car. */ public class Main { - public static void main(String[] args) { + public static final String FILE_LOCATION = "./resources/carCatalog.txt"; + + public static void main(String[] args) throws IOException { + String text = readFile(); + Car[] cars = getCars(getCarInformation(text)); + Scanner in = new Scanner(System.in); + System.out.print("Номер машины в списке: "); + int i = in.nextInt(); + + System.out.println(cars[i - 1].getBrand()); + System.out.println(cars[i - 1].getOwner()); + System.out.println(cars[i - 1].getNumber()); + } + + public static String readFile() throws IOException { + StringBuilder cars = new StringBuilder(); + try (FileReader reader = new FileReader(FILE_LOCATION)) { + int i; + while ((i = reader.read()) != -1) { + cars.append((char) i); + } + } + return cars.toString().trim(); + } + + public static Car[] getCars(String[] cars) { + Car[] carsArr = new Car[cars.length]; + for (int i = 0; i < carsArr.length; i++) { + String[] info = cars[i].split(","); + carsArr[i] = new Car(info[0].trim(), info[1].trim(), info[2].trim()); + } + return carsArr; + } + + private static String[] getCarInformation(String cars) { + return cars.replaceAll("Машина марки", "") + .replaceAll("владелец:", "") + .replaceAll("номер:", "") + .split("\n"); } } diff --git a/src/com/walking/lesson32_files_1/task3/Main.java b/src/com/walking/lesson32_files_1/task3/Main.java index 7032b7a4e..8fd6c56f5 100644 --- a/src/com/walking/lesson32_files_1/task3/Main.java +++ b/src/com/walking/lesson32_files_1/task3/Main.java @@ -1,5 +1,11 @@ package com.walking.lesson32_files_1.task3; +import com.walking.lesson21_immutable_object.car.Car; +import com.walking.lesson32_files_1.task3.repository.CarRepository; +import com.walking.lesson32_files_1.task3.service.CarService; + +import java.io.IOException; + /** * Реализуйте возможность добавления, удаления и изменения информации о машинах, * используя Задачи 1 и 2. @@ -7,6 +13,28 @@ * но вы можете сделать иную реализацию на свое усмотрение. */ public class Main { - public static void main(String[] args) { + public static void main(String[] args) throws IOException { + CarRepository repository = new CarRepository(); + repository.saveAll(setCars()); + repository.findAll(); + + CarService service = new CarService(repository); + service.add(new Car("Волга", "Курочкин Л.Д.", "зщ876е")); + service.update(new Car("Audi", "Вовочкин Д.Е.", "уе777к")); + service.delete(new Car("Ford", "Снегирь Ю.В.", "мр666м")); + + repository.saveAll(service.getAll()); + } + + private static Car[] setCars() { + Car[] cars = new Car[6]; + cars[0] = new Car("Audi", "Печкин Ф.Б.", "уе777к"); + cars[1] = new Car("BMW", "Борисов Ю.А.", "ос025р"); + cars[2] = new Car("Ford", "Снегирь Ю.В.", "мр666м"); + cars[3] = new Car("Bentley", "Белова Д.М.", "ра345з"); + cars[4] = new Car("Ferrari", "Сергеев К.Л.", "уе999з"); + cars[5] = new Car("Москвич", "Попов А.Д.", "ар832с"); + + return cars; } } 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..315cc4def --- /dev/null +++ b/src/com/walking/lesson32_files_1/task3/repository/CarRepository.java @@ -0,0 +1,85 @@ +package com.walking.lesson32_files_1.task3.repository; + +import com.walking.lesson21_immutable_object.car.Car; + +import java.io.FileOutputStream; +import java.io.FileReader; +import java.io.IOException; +import java.util.Arrays; + +public class CarRepository { + public static final String FILE_LOCATION = "./resources/carCatalog.txt"; + private Car[] carsArr; + + public void saveAll(Car[] cars) { + try (FileOutputStream fos = new FileOutputStream(FILE_LOCATION)) { + for (Car car : cars) { + String carInfo = car.toString() + "\n"; + byte[] bytes = carInfo.getBytes(); + fos.write(bytes, 0, bytes.length); + } + System.out.println("Файл записан."); + + } catch (IOException ex) { + throw new RuntimeException("Не удалось записать файл", ex); + } + } + + public void findAll() throws IOException { + String[] carsInfo = readFile().split("\n"); + Car[] arr = new Car[carsInfo.length]; + + for (int i = 0; i < arr.length; i++) { + arr[i] = getCar(carsInfo[i]); + } + this.carsArr = arr; + } + + public void deleteCar(int index) { + int length = carsArr.length; + Car[] updatedCars = new Car[length - 1]; + for (int i = 0; i < length; i++) { + if (i < index) { + updatedCars[i] = carsArr[i]; + } + + if (i > index) { + updatedCars[i - 1] = carsArr[i]; + } + } + this.carsArr = updatedCars; + } + + /** ты только про удаление написал, но я подумала, будет логично по аналогии сделать метод и с добавлением машины. + * если, конечно, я правильно поняла, какую логику сюда перенести надо было ахаха + */ + public void addCar(Car car) { + int length = carsArr.length; + Car[] updatedCars = Arrays.copyOf(carsArr, length + 1); + updatedCars[length] = car; + this.carsArr = updatedCars; + } + + public Car[] getCarsArr() { + return Arrays.copyOf(carsArr, carsArr.length); + } + + private String readFile() throws IOException { + StringBuilder cars = new StringBuilder(); + try (FileReader reader = new FileReader(FILE_LOCATION)) { + int i; + while ((i = reader.read()) != -1) { + cars.append((char) i); + } + } + return cars.toString().trim(); + } + + private Car getCar(String car) { + String[] info = car.split(","); + String brand = info[0] == null ? null : info[0].trim(); + String owner = info[1] == null ? null : info[1].trim(); + String number = info[2] == null ? null : info[2].trim(); + return new Car(brand, owner, number); + } +} 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..5933b4dad --- /dev/null +++ b/src/com/walking/lesson32_files_1/task3/service/CarService.java @@ -0,0 +1,68 @@ +package com.walking.lesson32_files_1.task3.service; +import com.walking.lesson21_immutable_object.car.Car; +import com.walking.lesson32_files_1.task3.repository.CarRepository; + +public class CarService { + public final CarRepository repository; + + public CarService(CarRepository repository) { + this.repository = repository; + } + + public void add(Car car) { + if (find(car) != null) { + System.out.println("Такая машина уже существует."); + return; + } + + repository.addCar(car); + System.out.println("Машина добавлена."); + } + + public void update(Car car) { + Car existedCar = find(car); + + if (existedCar == null) { + System.out.println("Машина не найдена."); + return; + } + + existedCar.setOwner(car.getOwner()); + System.out.println("Информация о владельце обновлена."); + } + + public void delete(Car car) { + int index = getIndex(car); + if (index == -1) { + System.out.println("Машина не найдена."); + return; + } + + repository.deleteCar(index); + System.out.println("Машина удалена."); + } + + public Car[] getAll() { + return repository.getCarsArr(); + } + + private Car find(Car car) { + Car[] cars = getAll(); + for (Car c : cars) { + if (c.equals(car)) { + return c; + } + } + return null; + } + + private int getIndex(Car car) { + Car[] cars = getAll(); + for (int i = 0; i < cars.length; i++) { + if (cars[i].equals(car)) { + return i; + } + } + return -1; + } +} diff --git a/src/com/walking/lesson33_files_2/task1/Main.java b/src/com/walking/lesson33_files_2/task1/Main.java deleted file mode 100644 index 86f08e722..000000000 --- a/src/com/walking/lesson33_files_2/task1/Main.java +++ /dev/null @@ -1,15 +0,0 @@ -package com.walking.lesson33_files_2.task1; - -/** - * Реализуйте Задачу 1 из урока - * ... - * с помощью: - *

- * Вариант 1: FileWriter; - * Вариант 2: BufferedOutputStream; - * Вариант 3: BufferedWriter. - */ -public class Main { - public static void main(String[] args) { - } -} 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..44fc593c0 --- /dev/null +++ b/src/com/walking/lesson33_files_2/task1/var1/Main.java @@ -0,0 +1,45 @@ +package com.walking.lesson33_files_2.task1.var1; + +import com.walking.lesson19_object_methods.car.Car; + +import java.io.*; + +/** + * Реализуйте Задачу 1 из урока + * ... + * с помощью: + *

+ * Вариант 1: FileWriter; + * Вариант 2: BufferedOutputStream; + * Вариант 3: BufferedWriter. + */ +public class Main { + public static final File FILE = new File("./resources", "carCatalog.txt"); + + public static void main(String[] args) throws IOException { + Car[] cars = new Car[6]; + cars[0] = new Car("Audi", "Печкин Ф.Б.", "уе777к"); + cars[1] = new Car("BMW", "Борисов Ю.А.", "ос025р"); + cars[2] = new Car("Ford", "Снегирь Ю.В.", "мр666м"); + cars[3] = new Car("Bentley", "Белова Д.М.", "ра345з"); + cars[4] = new Car("Ferrari", "Сергеев К.Л.", "уе999з"); + cars[5] = new Car("Москвич", "Попов А.Д.", "ар832с"); + + saveCars(cars); + } + + public static void saveCars(Car[] cars) throws IOException { + try (FileWriter writer = new FileWriter(FILE)) { + for (Car car : cars) { + String carInfo = car.toString(); + writer.write(carInfo); + writer.append('\n'); + writer.flush(); + } + System.out.println("Файл записан."); + + } catch (IOException ex) { + throw new RuntimeException("Не удалось записать файл", ex); + } + } +} 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..1619ee099 --- /dev/null +++ b/src/com/walking/lesson33_files_2/task1/var2/Main.java @@ -0,0 +1,46 @@ +package com.walking.lesson33_files_2.task1.var2; + +import com.walking.lesson19_object_methods.car.Car; + +import java.io.BufferedOutputStream; +import java.io.File; +import java.io.FileOutputStream; +import java.io.IOException; + +/** + * для второго варианта в таск2 и здесь сделала отдельный файл на англе, + * не уверена, можно ли через FileInputStream кириллицу читать + * (у меня не выходит) + */ +public class Main { + public static final File FILE = new File( "./resources", "carCatalog1.txt"); + + public static void main(String[] args) throws IOException { + Car[] cars = new Car[5]; + cars[0] = new Car("Audi", "Styles H.", "rt777e"); + cars[1] = new Car("BMW", "Steeve J.", "er025w"); + cars[2] = new Car("Ford", "Potter H.", "we666a"); + cars[3] = new Car("Bentley", "Malfoy D.", "po345r"); + cars[4] = new Car("Ferrari", "Hadid G..", "re999t"); + + saveCars(cars); + } + + public static void saveCars(Car[] cars) throws IOException { + try (FileOutputStream fos = new FileOutputStream(FILE); + BufferedOutputStream bos = new BufferedOutputStream(fos)) { + for (Car car : cars) { + byte[] buffer = getCarInfo(car).getBytes(); + bos.write(buffer, 0, buffer.length); + } + System.out.println("Файл записан."); + + } catch (IOException ex) { + throw new RuntimeException("Не удалось записать файл", ex); + } + } + + private static String getCarInfo(Car car) { + return "%s, %s, %s.\n".formatted(car.getBrand(), car.getOwner(), car.getNumber()); + } +} 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..6f4f899ad --- /dev/null +++ b/src/com/walking/lesson33_files_2/task1/var3/Main.java @@ -0,0 +1,38 @@ +package com.walking.lesson33_files_2.task1.var3; + +import com.walking.lesson19_object_methods.car.Car; + +import java.io.BufferedWriter; +import java.io.File; +import java.io.FileWriter; +import java.io.IOException; + +public class Main { + public static final File FILE = new File( "./resources", "carCatalog.txt"); + + public static void main(String[] args) throws IOException { + Car[] cars = new Car[6]; + cars[0] = new Car("Audi", "Печкин Ф.Б.", "уе777к"); + cars[1] = new Car("BMW", "Борисов Ю.А.", "ос025р"); + cars[2] = new Car("Ford", "Снегирь Ю.В.", "мр666м"); + cars[3] = new Car("Bentley", "Белова Д.М.", "ра345з"); + cars[4] = new Car("Ferrari", "Сергеев К.Л.", "уе999з"); + cars[5] = new Car("Москвич", "Попов А.Д.", "ар832с"); + + saveCars(cars); + } + + public static void saveCars(Car[] cars) throws IOException { + try (FileWriter writer = new FileWriter(FILE); + BufferedWriter bw = new BufferedWriter(writer)) { + for (Car car : cars) { + String carInfo = car.toString(); + bw.write(carInfo + "\n"); + } + System.out.println("Файл записан."); + + } catch (IOException ex) { + throw new RuntimeException("Не удалось записать файл", ex); + } + } +} diff --git a/src/com/walking/lesson33_files_2/task2/Main.java b/src/com/walking/lesson33_files_2/task2/Main.java deleted file mode 100644 index cae9b2874..000000000 --- a/src/com/walking/lesson33_files_2/task2/Main.java +++ /dev/null @@ -1,15 +0,0 @@ -package com.walking.lesson33_files_2.task2; - -/** - * Реализуйте Задачу 2 из урока - * ... - * с помощью: - *

- * Вариант 1: FileReader; - * Вариант 2: BufferedInputStream; - * Вариант 3: BufferedReader. - */ -public class Main { - public static void main(String[] args) { - } -} 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..58c98ae20 --- /dev/null +++ b/src/com/walking/lesson33_files_2/task2/var1/Main.java @@ -0,0 +1,60 @@ +package com.walking.lesson33_files_2.task2.var1; + +import com.walking.lesson19_object_methods.car.Car; + +import java.io.File; +import java.io.FileReader; +import java.io.IOException; +import java.util.Scanner; + +/** + * Реализуйте Задачу 2 из урока + * ... + * с помощью: + *

+ * Вариант 1: FileReader; + * Вариант 2: BufferedInputStream; + * Вариант 3: BufferedReader. + */ +public class Main { + public static final File FILE = new File("./resources", "carCatalog.txt"); + + public static void main(String[] args) throws IOException { + String text = readFile(); + Car[] cars = getCars(getCarInformation(text)); + Scanner in = new Scanner(System.in); + System.out.print("Номер машины в списке: "); + int i = in.nextInt(); + + System.out.println(cars[i - 1].getBrand()); + System.out.println(cars[i - 1].getOwner()); + System.out.println(cars[i - 1].getNumber()); + } + + public static String readFile() throws IOException { + StringBuilder cars = new StringBuilder(); + try (FileReader reader = new FileReader(FILE)) { + int i; + while ((i = reader.read()) != -1) { + cars.append((char) i); + } + } + return cars.toString().trim(); + } + + public static Car[] getCars(String[] cars) { + Car[] carsArr = new Car[cars.length]; + for (int i = 0; i < carsArr.length; i++) { + String[] info = cars[i].split(","); + carsArr[i] = new Car(info[0].trim(), info[1].trim(), info[2].trim()); + } + return carsArr; + } + + private static String[] getCarInformation(String cars) { + return cars.replaceAll("Машина марки", "") + .replaceAll("владелец:", "") + .replaceAll("номер:", "") + .split("\n"); + } +} 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..3efce5e1f --- /dev/null +++ b/src/com/walking/lesson33_files_2/task2/var2/Main.java @@ -0,0 +1,50 @@ +package com.walking.lesson33_files_2.task2.var2; + +import com.walking.lesson19_object_methods.car.Car; + +import java.io.BufferedInputStream; +import java.io.File; +import java.io.FileInputStream; +import java.io.IOException; +import java.util.Scanner; + +public class Main { + public static final File FILE = new File("./resources", "carCatalog1.txt"); + + public static void main(String[] args) throws IOException { + String text = readFile(); + Car[] cars = getCars(getCarInformation(text)); + Scanner in = new Scanner(System.in); + System.out.print("Номер машины в списке: "); + int i = in.nextInt(); + + System.out.println(cars[i - 1].getBrand()); + System.out.println(cars[i - 1].getOwner()); + System.out.println(cars[i - 1].getNumber()); + } + + public static String readFile() throws IOException { + StringBuilder cars = new StringBuilder(); + try (FileInputStream fis = new FileInputStream(FILE); + BufferedInputStream bis = new BufferedInputStream(fis)) { + int i; + while ((i = bis.read()) != -1) { + cars.append((char) i); + } + } + return cars.toString().trim(); + } + + public static Car[] getCars(String[] cars) { + Car[] carsArr = new Car[cars.length]; + for (int i = 0; i < carsArr.length; i++) { + String[] info = cars[i].split(","); + carsArr[i] = new Car(info[0].trim(), info[1].trim(), info[2].trim()); + } + return carsArr; + } + + private static String[] getCarInformation(String cars) { + return cars.split("\n"); + } +} 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..259624ce7 --- /dev/null +++ b/src/com/walking/lesson33_files_2/task2/var3/Main.java @@ -0,0 +1,52 @@ +package com.walking.lesson33_files_2.task2.var3; + +import com.walking.lesson19_object_methods.car.Car; + +import java.io.BufferedReader; +import java.io.File; +import java.io.FileReader; +import java.io.IOException; +import java.util.Scanner; + +public class Main { + public static final File FILE = new File("./resources", "carCatalog.txt"); + + public static void main(String[] args) throws IOException { + String text = readFile(); + Car[] cars = getCars(getCarInformation(text)); + Scanner in = new Scanner(System.in); + System.out.print("Номер машины в списке: "); + int i = in.nextInt(); + + System.out.println(cars[i - 1].getBrand()); + System.out.println(cars[i - 1].getOwner()); + System.out.println(cars[i - 1].getNumber()); + } + + public static String readFile() throws IOException { + StringBuilder cars = new StringBuilder(); + try (BufferedReader br = new BufferedReader(new FileReader(FILE))) { + int i; + while ((i = br.read()) != -1) { + cars.append((char) i); + } + } + return cars.toString().trim(); + } + + public static Car[] getCars(String[] cars) { + Car[] carsArr = new Car[cars.length]; + for (int i = 0; i < carsArr.length; i++) { + String[] info = cars[i].split(","); + carsArr[i] = new Car(info[0].trim(), info[1].trim(), info[2].trim()); + } + return carsArr; + } + + private static String[] getCarInformation(String cars) { + return cars.replaceAll("Машина марки", "") + .replaceAll("владелец:", "") + .replaceAll("номер:", "") + .split("\n"); + } +} diff --git a/src/com/walking/lesson34_date_time/task1/Main.java b/src/com/walking/lesson34_date_time/task1/Main.java index 9e156d996..6e5694898 100644 --- a/src/com/walking/lesson34_date_time/task1/Main.java +++ b/src/com/walking/lesson34_date_time/task1/Main.java @@ -1,10 +1,30 @@ package com.walking.lesson34_date_time.task1; +import java.time.LocalDateTime; +import java.time.format.DateTimeFormatter; +import java.util.Scanner; + /** * Реализуйте метод, возвращающий объект LocalDateTime на основании переданной строки. * Пример входящей строки: 20.12.2022 20:16:00. */ public class Main { - public static void main(String[] args) { + public static final DateTimeFormatter formatter = DateTimeFormatter.ofPattern("dd.MM.y HH:mm:ss"); + + public static void main(String[] args) throws InterruptedException { + System.out.print("Введите дату: "); + Scanner in = new Scanner(System.in); + String date = in.nextLine(); + + LocalDateTime dateTime = getLocalDateTime(date); + System.out.println(dateTime); + } + + public static LocalDateTime getLocalDateTime(String dateTime) { + try { + return LocalDateTime.parse(dateTime, formatter); + } catch (Exception e) { + throw new RuntimeException("Дата указана некорректно."); + } } } diff --git a/src/com/walking/lesson34_date_time/task2/Main.java b/src/com/walking/lesson34_date_time/task2/Main.java index fc6d7351c..27a769d83 100644 --- a/src/com/walking/lesson34_date_time/task2/Main.java +++ b/src/com/walking/lesson34_date_time/task2/Main.java @@ -1,10 +1,41 @@ package com.walking.lesson34_date_time.task2; +import java.time.LocalDateTime; +import java.time.format.DateTimeFormatter; +import java.util.Scanner; + /** * Реализуйте программу, выводящую в консоль сообщение, * являются ли введенные с клавиатуры дата и время больше или меньше текущего. */ public class Main { + public static final DateTimeFormatter formatter = DateTimeFormatter.ofPattern("dd.MM.y HH:mm"); + public static void main(String[] args) { + System.out.print("Введите дату: "); + Scanner in = new Scanner(System.in); + String date = in.nextLine(); + + LocalDateTime dateTime = getLocalDateTime(date); + compareDateTime(dateTime); + } + + public static void compareDateTime(LocalDateTime dateTime) { + LocalDateTime currentDateTime = LocalDateTime.now(); + if (currentDateTime.isAfter(dateTime)) { + System.out.println("Указанна дата раньше текущей."); + } else if (currentDateTime.isBefore(dateTime)) { + System.out.println("Указанна дата позже текущей."); + } else { + System.out.println("Указана текущая дата."); + } + } + + private static LocalDateTime getLocalDateTime(String dateTime) { + try { + return LocalDateTime.parse(dateTime, formatter); + } catch (Exception e) { + throw new RuntimeException("Дата указана некорректно."); + } } } diff --git a/src/com/walking/lesson34_date_time/task3/Main.java b/src/com/walking/lesson34_date_time/task3/Main.java index 3dcda11b6..ea55865b4 100644 --- a/src/com/walking/lesson34_date_time/task3/Main.java +++ b/src/com/walking/lesson34_date_time/task3/Main.java @@ -1,10 +1,85 @@ package com.walking.lesson34_date_time.task3; +import java.time.LocalDateTime; +import java.time.Month; +import java.time.format.DateTimeFormatter; +import java.time.temporal.ChronoUnit; +import java.util.GregorianCalendar; +import java.util.Scanner; + /** * Реализуйте программу, выводящую в консоль количество времени между двумя * введенными с клавиатуры датами и временем в секундах, минутах, часах, днях, месяцах и годах. */ public class Main { + public static final DateTimeFormatter formatter = DateTimeFormatter.ofPattern("dd.MM.y HH:mm:ss"); + public static void main(String[] args) { + System.out.print("Введите первую дату: "); + Scanner in = new Scanner(System.in); + String date1 = in.nextLine(); + System.out.print("Введите вторую дату: "); + String date2 = in.nextLine(); + + System.out.print(countTimeBetweenDates(getLocalDateTime(date1), getLocalDateTime(date2))); + } + + public static String countTimeBetweenDates(LocalDateTime date1, LocalDateTime date2) { + long seconds = Math.abs(date1.until(date2, ChronoUnit.SECONDS)); + long minutes = Math.abs(date1.until(date2, ChronoUnit.MINUTES)); + long hours = Math.abs(date1.until(date2, ChronoUnit.HOURS)); + long days = Math.abs(date1.until(date2, ChronoUnit.DAYS)); + long months = Math.abs(date1.until(date2, ChronoUnit.MONTHS)); + long years = Math.abs(date1.until(date2, ChronoUnit.YEARS)); + + long finalMonth = months % 12; + int finalDays = date1.isBefore(date2) ? countDays(date1, date2) : countDays(date2, date1); + long finalHours = hours % 24; + long finalMinutes = minutes % 60; + long finalSeconds = seconds % 60; + + return """ + Seconds: %d + Minutes: %d + Hours: %d + Days: %d + Months: %d + Years: %d + + Summary: %d years, %d months, %d days, %d hours, %d minutes, %d seconds + """.formatted(seconds, + minutes, + hours, + days, + months, + years, + years, + finalMonth, + finalDays, + finalHours, + finalMinutes, + finalSeconds); + } + + private static LocalDateTime getLocalDateTime(String dateTime) { + try { + return LocalDateTime.parse(dateTime, formatter); + } catch (Exception e) { + throw new RuntimeException("Дата указана некорректно."); + } + } + + private static int countDays(LocalDateTime dateBefore, LocalDateTime dateAfter) { + int day1 = dateBefore.getDayOfMonth(); + int day2 = dateAfter.getDayOfMonth(); + + if (day1 < day2) { + return day2 - day1; + } + LocalDateTime date = dateAfter.minusMonths(1); + Month month = date.getMonth(); + int daysInMonth = month.length(new GregorianCalendar().isLeapYear(date.getYear())); + return daysInMonth - day1 + day2; + } } diff --git a/src/com/walking/lesson37_collection_list/task1/Main.java b/src/com/walking/lesson37_collection_list/task1/Main.java index 4753b4e8f..6afde7d80 100644 --- a/src/com/walking/lesson37_collection_list/task1/Main.java +++ b/src/com/walking/lesson37_collection_list/task1/Main.java @@ -1,5 +1,9 @@ package com.walking.lesson37_collection_list.task1; +import com.walking.lesson37_collection_list.task1.exception.CounterAlreadyExistException; +import com.walking.lesson37_collection_list.task1.model.Counter; +import com.walking.lesson37_collection_list.task1.service.CounterService; + /** * Реализуйте задачу * ..., используя ArrayList. @@ -10,6 +14,38 @@ * Изменилось ли что-то в кодовой базе при использовании списка другой реализации? */ public class Main { + public static final String GAS_COUNTER_NAME = "Газ"; + public static final String COLD_WATER_COUNTER_NAME = "Холодная вода"; + public static final String HOT_WATER_COUNTER_NAME = "Горячая вода"; + public static final String ELECTRIC_COUNTER_NAME = "Электричество"; + + public static final String M_3_UNIT = "м3"; + public static final String KW_H_UNIT = "кВт/ч"; + public static void main(String[] args) { + Counter gasCounter = new Counter(GAS_COUNTER_NAME, M_3_UNIT); + Counter coldWaterCounter = new Counter(COLD_WATER_COUNTER_NAME, M_3_UNIT); + Counter hotWaterCounter = new Counter(HOT_WATER_COUNTER_NAME, M_3_UNIT); + Counter electricCounter = new Counter(ELECTRIC_COUNTER_NAME, KW_H_UNIT); + + CounterService counterService = new CounterService(gasCounter, coldWaterCounter); + counterService.add(hotWaterCounter); + counterService.increaseValue(hotWaterCounter, 23); + + try { + counterService.add(new Counter(HOT_WATER_COUNTER_NAME, M_3_UNIT, 45)); + } catch (CounterAlreadyExistException e) { + System.out.println(e.getMessage()); + } + counterService.incrementValue(electricCounter); + counterService.delete(coldWaterCounter); + + printCounterValues(counterService); + } + + public static void printCounterValues(CounterService counterService) { + for(Counter counter : counterService.getCounters()) { + System.out.print(counter.getInfo()); + } } } diff --git a/src/com/walking/lesson37_collection_list/task1/exception/CounterAlreadyExistException.java b/src/com/walking/lesson37_collection_list/task1/exception/CounterAlreadyExistException.java new file mode 100644 index 000000000..4aba6286e --- /dev/null +++ b/src/com/walking/lesson37_collection_list/task1/exception/CounterAlreadyExistException.java @@ -0,0 +1,14 @@ +package com.walking.lesson37_collection_list.task1.exception; + +public class CounterAlreadyExistException extends RuntimeException { + private final String name; + + public CounterAlreadyExistException(String name) { + super("Счётчик с названием '%s' уже существует.".formatted(name)); + this.name = name; + } + + public String getName() { + return name; + } +} diff --git a/src/com/walking/lesson37_collection_list/task1/exception/CounterIsNullException.java b/src/com/walking/lesson37_collection_list/task1/exception/CounterIsNullException.java new file mode 100644 index 000000000..635aee150 --- /dev/null +++ b/src/com/walking/lesson37_collection_list/task1/exception/CounterIsNullException.java @@ -0,0 +1,7 @@ +package com.walking.lesson37_collection_list.task1.exception; + +public class CounterIsNullException extends RuntimeException { + public CounterIsNullException(String message) { + super(message); + } +} 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..81462f4ca --- /dev/null +++ b/src/com/walking/lesson37_collection_list/task1/model/Counter.java @@ -0,0 +1,38 @@ +package com.walking.lesson37_collection_list.task1.model; + +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; + } + + public String getInfo() { + return "%s: %d %s%n".formatted(name, value, unit); + } +} 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..1377a86e5 --- /dev/null +++ b/src/com/walking/lesson37_collection_list/task1/service/CounterService.java @@ -0,0 +1,98 @@ +package com.walking.lesson37_collection_list.task1.service; + +import com.walking.lesson37_collection_list.task1.exception.CounterAlreadyExistException; +import com.walking.lesson37_collection_list.task1.exception.CounterIsNullException; +import com.walking.lesson37_collection_list.task1.model.Counter; + +import java.util.ArrayList; +import java.util.List; + +public class CounterService { + private final List counters; + + public CounterService(Counter... counters) { + this.counters = new ArrayList<>(List.of(counters)); + } + + public CounterService(List counters) { + this.counters = new ArrayList<>(counters); + } + + public Counter getByName(String name) { + for (Counter counter : counters) { + if (name.equals(counter.getNAME())) { + return counter; + } + } + return null; + } + + public Counter add(Counter counter) throws CounterAlreadyExistException, CounterIsNullException { + if (isNull(counter)) { + throw new CounterIsNullException("Невозможно добавить счётчик равный null."); + } + + if (isContains(counter)) { + throw new CounterAlreadyExistException(counter.getNAME()); + } + + counters.add(counter); + System.out.printf("Счётчик '%s' добавлен.\n", counter.getNAME()); + return counter; + } + + public Counter delete(Counter counter) { + counters.remove(counter); + System.out.printf("Счётчик '%s' удалён.\n", counter.getNAME()); + return counter; + } + + public Counter increaseValue(Counter counter, int value) throws CounterIsNullException { + if (isNull(counter)) { + throw new CounterIsNullException("Изменить показания счётчика, равного null, невозможно."); + } + + int newValue = counter.getValue() + value; + counter.setValue(newValue); + System.out.printf("Показания счётчика '%s' обновлены.\n", counter.getNAME()); + return counter; + } + + public Counter incrementValue(Counter counter) { + return increaseValue(counter, 1); + } + + public Counter increaseValue(String name, int value) { + return increaseValue(getByName(name), value); + } + + public Counter incrementValue(String name) { + return incrementValue(getByName(name)); + } + + public Counter resetValue(Counter counter) { + counter.setValue(0); + return counter; + } + + public Counter resetValue(String name) { + return resetValue(getByName(name)); + } + + public List getCounters() { + return List.copyOf(counters); + } + + private boolean isContains(Counter counter) { + for (Counter c : counters) { + if (counter.getNAME().equals(c.getNAME())) { + return true; + } + } + return false; + } + + private boolean isNull(Counter counter) { + return counter == null; + } +} diff --git a/src/com/walking/lesson37_collection_list/task2/Main.java b/src/com/walking/lesson37_collection_list/task2/Main.java index 51a4575bb..5505c6b85 100644 --- a/src/com/walking/lesson37_collection_list/task2/Main.java +++ b/src/com/walking/lesson37_collection_list/task2/Main.java @@ -1,5 +1,11 @@ package com.walking.lesson37_collection_list.task2; +import com.walking.lesson37_collection_list.task2.collection.MyCollection; + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; + /** * Попробуйте реализовать собственную коллекцию, наследуясь от Collection. * За основу можно взять @@ -10,5 +16,20 @@ */ public class Main { public static void main(String[] args) { + MyCollection strings = new MyCollection<>(); + strings.add("hello"); + strings.add("how"); + strings.add("are"); + strings.add("you"); + + System.out.println(Arrays.toString(strings.toArray())); + + ArrayList arrayList = new ArrayList<>(List.of("I", "know", "why")); + strings.addAll(arrayList); + System.out.println(Arrays.toString(strings.toArray())); + System.out.println(strings.containsAll(arrayList)); + strings.remove("hello"); + System.out.println(Arrays.toString(strings.toArray())); + System.out.println(strings.size()); } } diff --git a/src/com/walking/lesson37_collection_list/task2/collection/MyCollection.java b/src/com/walking/lesson37_collection_list/task2/collection/MyCollection.java new file mode 100644 index 000000000..8e4dec0e0 --- /dev/null +++ b/src/com/walking/lesson37_collection_list/task2/collection/MyCollection.java @@ -0,0 +1,174 @@ +package com.walking.lesson37_collection_list.task2.collection; + +import java.util.Collection; +import java.util.Iterator; + +public class MyCollection implements Collection { + private Element top; + private int size; + + public MyCollection() { + } + + public MyCollection(E top) { + this.top = new Element<>(top); + size++; + } + + @Override + public int size() { + return size; + } + + @Override + public boolean isEmpty() { + return size == 0; + } + + @Override + public boolean contains(Object o) { + Element el = top; + + while (el != null) { + if (o.equals(el.value)) { + return true; + } + el = el.previous; + } + return false; + } + + @Override + public Object[] toArray() { + Object[] elements = new Object[size]; + Element lastElement = top; + for (int i = size - 1; i >= 0; i--) { + elements[i] = lastElement.value; + lastElement = lastElement.previous; + } + + return elements; + } + + @Override + public boolean add(E el) { + top = new Element<>(top, el); + size++; + return true; + } + + @Override + public boolean remove(Object o) { + if (isEmpty()) { + return false; + } + + if (o.equals(top.value)) { + top = top.previous; + size--; + return true; + } + + Element el = top; + while (el.previous != null) { + if (o.equals(el.previous.value)) { + el.previous = el.previous.previous; + size--; + return true; + } + el = el.previous; + } + return false; + } + + @Override + public boolean addAll(Collection c) { + if (c.isEmpty()) { + return false; + } + + for (E e : c) { + add(e); + } + return true; + } + + @Override + public void clear() { + size = 0; + top = null; + } + + @Override + public boolean retainAll(Collection c) { + if (c.isEmpty()) { + return false; + } + + while (top != null && !c.contains(top.value)) { + top = top.previous; + size--; + } + + Element el = top; + while (el.previous != null) { + if (!c.contains(el.previous.value)) { + el.previous = el.previous.previous; + size--; + } else { + el = el.previous; + } + } + + return size > 0; + } + + @Override + public boolean removeAll(Collection c) { + if (c.isEmpty()) { + return false; + } + + boolean isRemoved = false; + for (Object e : c) { + if (remove(e)) { + isRemoved = true; + } + } + return isRemoved; + } + + @Override + public boolean containsAll(Collection c) { + for (Object o : c) { + if(!contains(o)) { + return false; + } + } + return true; + } + + @Override + public Object[] toArray(Object[] a) { + return a; + } + + @Override + public Iterator iterator() { + return null; + } + + private static class Element { + private final E value; + private Element previous; + + private Element(E value) { + this.value = value; + } + + private Element(Element previous, E value) { + this.value = value; + this.previous = previous; + } + } +} diff --git a/src/com/walking/lesson38_comparing/task1/Main.java b/src/com/walking/lesson38_comparing/task1/Main.java index 230a6e319..a97f5a1cd 100644 --- a/src/com/walking/lesson38_comparing/task1/Main.java +++ b/src/com/walking/lesson38_comparing/task1/Main.java @@ -1,5 +1,9 @@ package com.walking.lesson38_comparing.task1; +import com.walking.lesson38_comparing.task1.model.*; + +import java.util.*; + /** * Используя классы-сущности из задачи * ... @@ -13,5 +17,83 @@ */ public class Main { public static void main(String[] args) { + ArrayList cars = new ArrayList<>(createList()); + sortByIdentifier(cars); + printList(cars); + } + + public static void sortByOwner(List cars) { + Comparator comparator = new Comparator() { + @Override + public int compare(Car o1, Car o2) { + return o1.getOwner().compareTo(o2.getOwner()); + } + }; + + cars.sort(comparator); + } + + public static void sortByNumber(List cars) { + Comparator comparator = new Comparator() { + @Override + public int compare(Car o1, Car o2) { + return o1.getIdentifier() + .getNumber() + .compareTo(o2.getIdentifier().getNumber()); + } + }; + + cars.sort(comparator); + } + + public static void sortByBrand(List cars) { + Comparator comparator = new Comparator() { + @Override + public int compare(Car o1, Car o2) { + return o1.getIdentifier() + .getBrand() + .compareTo(o2.getIdentifier().getBrand()); + } + }; + + cars.sort(comparator); + } + + public static void sortByIdentifier(List cars) { + Comparator comparator = new Comparator() { + @Override + public int compare(Car o1, Car o2) { + int result = o1.getIdentifier() + .getBrand() + .compareTo(o2.getIdentifier().getBrand()); + if (result == 0) { + return o1.getIdentifier() + .getNumber() + .compareTo(o2.getIdentifier().getNumber()); + } + return result; + } + }; + + cars.sort(comparator); + } + + public static List createList() { + return List.of( + new Car("Audi", "Печкин Ф.Б.", "уе777к"), + new Car("BMW", "Борисов Ю.А.", "ос025р"), + new Car("Ford", "Снегирь Ю.В.", "мр666м"), + new Car("Bentley", "Белова Д.М.", "ра345з"), + new Car("Ferrari", "Сергеев К.Л.", "уе999з"), + new Car("Москвич", "Попов А.Д.", "ар832с"), + new Car("Audi", "Васильев П.Д.", "кв865а"), + new Car("BMW", "Лебедев А.Ю.", "ау000ш"), + new Car("Москвич", "Алексеев Л.Б.", "гн123г")); + } + + public static void printList(List cars) { + for (Car car : cars) { + System.out.println(car); + } } } 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..7db2201df --- /dev/null +++ b/src/com/walking/lesson38_comparing/task1/model/Car.java @@ -0,0 +1,50 @@ +package com.walking.lesson38_comparing.task1.model; + +public class Car { + private final CarIdentifier identifier; + private String owner; + + public Car(String brand, String owner, String number) { + this.identifier = new CarIdentifier(brand, number); + this.owner = owner; + } + + public Car(CarIdentifier identifier) { + this.identifier = identifier; + } + + @Override + public String toString() { + return identifier.getBrand() + ", " + owner + ", " + identifier.getNumber(); + } + + public CarIdentifier getIdentifier() { + return identifier; + } + + public String getOwner() { + return owner; + } + + public void setOwner(String owner) { + this.owner = owner; + } + + public boolean equals(Object car) { + if (this == car) { + return true; + } + + if (car == null) { + return false; + } + + if (!getClass().equals(car.getClass())) { + return false; + } + + Car c = (Car) car; + + return identifier.equals(c.identifier); + } +} 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..3f1e18301 --- /dev/null +++ b/src/com/walking/lesson38_comparing/task1/model/CarIdentifier.java @@ -0,0 +1,47 @@ +package com.walking.lesson38_comparing.task1.model; + +public final class CarIdentifier { + private final String brand; + private final String number; + + public CarIdentifier(String brand, String number) { + this.brand = brand; + this.number = number; + } + + @Override + public boolean equals(Object car) { + if (this == car) { + return true; + } + + if (car == null) { + return false; + } + + if (!getClass().equals(car.getClass())) { + return false; + } + + CarIdentifier c = (CarIdentifier) car; + + return number.equals(c.number) && brand.equals(c.brand); + } + + @Override + public int hashCode() { + int result = brand != null ? brand.hashCode() : 0; + result *= 31 + (number != null ? number.hashCode() : 0); + + return result; + } + + public String getBrand() { + return brand; + } + + public String getNumber() { + return number; + } + +} diff --git a/src/com/walking/lesson38_comparing/task2/Main.java b/src/com/walking/lesson38_comparing/task2/Main.java index def3f23b9..6666245b1 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,27 @@ */ public class Main { public static void main(String[] args) { + List cars = createList(); + cars.sort(Comparator.naturalOrder()); + printList(cars); + } + + public static ArrayList createList() { + return new ArrayList<>(List.of( + new Car("Audi", "Печкин Ф.Б.", "уе777к"), + new Car("BMW", "Борисов Ю.А.", "ос025р"), + new Car("Ford", "Снегирь Ю.В.", "мр666м"), + new Car("Bentley", "Белова Д.М.", "ра345з"), + new Car("Ferrari", "Сергеев К.Л.", "уе999з"), + new Car("Москвич", "Попов А.Д.", "ар832с"), + new Car("Audi", "Васильев П.Д.", "кв865а"), + new Car("BMW", "Лебедев А.Ю.", "ау000ш"), + new Car("Москвич", "Алексеев Л.Б.", "гн123г"))); + } + + public static void printList(List cars) { + for (Car car : cars) { + System.out.println(car); + } } } 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..49f9416dc --- /dev/null +++ b/src/com/walking/lesson38_comparing/task2/model/Car.java @@ -0,0 +1,55 @@ +package com.walking.lesson38_comparing.task2.model; + +public class Car implements Comparable { + private final CarIdentifier identifier; + private String owner; + + public Car(String brand, String owner, String number) { + this.identifier = new CarIdentifier(brand, number); + this.owner = owner; + } + + public Car(CarIdentifier identifier) { + this.identifier = identifier; + } + + @Override + public String toString() { + return identifier.getBrand() + ", " + owner + ", " + identifier.getNumber(); + } + + public CarIdentifier getIdentifier() { + return identifier; + } + + public String getOwner() { + return owner; + } + + public void setOwner(String owner) { + this.owner = owner; + } + + public boolean equals(Object car) { + if (this == car) { + return true; + } + + if (car == null) { + return false; + } + + if (!getClass().equals(car.getClass())) { + return false; + } + + Car c = (Car) car; + + return identifier.equals(c.identifier); + } + + @Override + public int compareTo(Car o) { + return identifier.compareTo(o.identifier); + } +} 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..4e8a1db6a --- /dev/null +++ b/src/com/walking/lesson38_comparing/task2/model/CarIdentifier.java @@ -0,0 +1,55 @@ +package com.walking.lesson38_comparing.task2.model; + +public final class CarIdentifier implements Comparable { + private final String brand; + private final String number; + + public CarIdentifier(String brand, String number) { + this.brand = brand; + this.number = number; + } + + @Override + public boolean equals(Object car) { + if (this == car) { + return true; + } + + if (car == null) { + return false; + } + + if (!getClass().equals(car.getClass())) { + return false; + } + + CarIdentifier c = (CarIdentifier) car; + + return number.equals(c.number) && brand.equals(c.brand); + } + + @Override + public int hashCode() { + int result = brand != null ? brand.hashCode() : 0; + result *= 31 + (number != null ? number.hashCode() : 0); + + return result; + } + + public String getBrand() { + return brand; + } + + public String getNumber() { + return number; + } + + @Override + public int compareTo(CarIdentifier o) { + int result = brand.compareTo(o.brand); + if (result == 0) { + result = number.compareTo(o.number); + } + return result; + } +} diff --git a/src/com/walking/lesson39_queue1/task1/Main.java b/src/com/walking/lesson39_queue1/task1/Main.java index a19c5ee93..6e38b9b4d 100644 --- a/src/com/walking/lesson39_queue1/task1/Main.java +++ b/src/com/walking/lesson39_queue1/task1/Main.java @@ -1,5 +1,7 @@ package com.walking.lesson39_queue1.task1; +import com.walking.lesson39_queue1.task1.list.MyList; + /** * Реализуйте односвязный список (можно использовать реализацию в рамках * ...). @@ -11,5 +13,15 @@ */ public class Main { public static void main(String[] args) { + MyList newList = new MyList<>(); + newList.add("4"); + newList.add("4"); + newList.add("4"); + newList.add("4"); + newList.add("4"); + + System.out.println(newList); + newList.remove("4"); + System.out.println(newList); } } diff --git a/src/com/walking/lesson39_queue1/task1/list/MyList.java b/src/com/walking/lesson39_queue1/task1/list/MyList.java new file mode 100644 index 000000000..a268f9350 --- /dev/null +++ b/src/com/walking/lesson39_queue1/task1/list/MyList.java @@ -0,0 +1,129 @@ +package com.walking.lesson39_queue1.task1.list; + +public class MyList { + private Node tail; + int size; + + public MyList() { + } + + public MyList(E top) { + this.tail = new Node<>(top); + size++; + } + + public int getSize() { + return size; + } + + public boolean isEmpty() { + return size == 0; + } + + public boolean contains(Object o) { + Node el = tail; + + while (el != null) { + if (o.equals(el.value)) { + return true; + } + el = el.previous; + } + return false; + } + + public void add(E el) { + tail = new Node<>(tail, el); + size++; + } + + public void removeTail() { + if (isEmpty()) { + return; + } + + tail = tail.previous; + size--; + } + + public void remove(Object o) { + while (!isEmpty() && o.equals(tail.value)) { + removeTail(); + } + + if (!isEmpty()) { + Node el = tail; + while (el.previous != null) { + if (o.equals(el.previous.value)) { + el.previous = el.previous.previous; + size--; + } else { + el = el.previous; + } + } + } + } + + public String toString() { + StringBuilder allElements = new StringBuilder(); + Node el = tail; + + while (el != null) { + allElements.append(el.value); + if (el.previous != null) { + allElements.append(", "); + } + el = el.previous; + } + return allElements.toString(); + } + + public void reverse() { + Node prev = null; + Node top = tail; + + while (top != null) { + Node newTail = top.previous; + top.previous = prev; + prev = top; + top = newTail; + } + + tail = prev; + } + + public void removeEvenHashCodes() { + while (!isEmpty() && tail.hashCode() % 2 == 0) { + tail = tail.previous; + size--; + } + + Node current = tail; + while (current.previous != null) { + if (current.previous.hashCode() % 2 == 0) { + current.previous = current.previous.previous; + size--; + } else { + current = current.previous; + } + } + } + + public Object getTailValue() { + return tail.value; + } + + private static class Node { + private final E value; + private Node previous; + + private Node(E value) { + this.value = value; + } + + private Node(Node previous, E value) { + this.value = value; + this.previous = previous; + } + } +} diff --git a/src/com/walking/lesson39_queue1/task2/Main.java b/src/com/walking/lesson39_queue1/task2/Main.java index e4aa01a2a..5843a12de 100644 --- a/src/com/walking/lesson39_queue1/task2/Main.java +++ b/src/com/walking/lesson39_queue1/task2/Main.java @@ -1,10 +1,22 @@ package com.walking.lesson39_queue1.task2; +import com.walking.lesson39_queue1.task2.stack.MyStack; + /** * Реализуйте структуру данных стек. Используйте односвязный список из Задачи 1. * При этом изменять сам класс, реализующий односвязный список, недопустимо. */ public class Main { public static void main(String[] args) { + MyStack nums = new MyStack<>(12); + nums.push(23); + nums.push(34); + nums.push(42); + nums.push(28); + + System.out.println(nums.peek()); + System.out.println(nums.pop()); + System.out.println(nums.pop()); + System.out.println(nums.pop()); } } diff --git a/src/com/walking/lesson39_queue1/task2/stack/MyStack.java b/src/com/walking/lesson39_queue1/task2/stack/MyStack.java new file mode 100644 index 000000000..aa761202d --- /dev/null +++ b/src/com/walking/lesson39_queue1/task2/stack/MyStack.java @@ -0,0 +1,29 @@ +package com.walking.lesson39_queue1.task2.stack; + +import com.walking.lesson39_queue1.task1.list.MyList; + +public class MyStack { + private final MyList list; + + public MyStack(E el) { + this.list = new MyList<>(el); + } + + public MyStack() { + this.list = new MyList<>(); + } + + public Object peek() { + return list.getTailValue(); + } + + public void push(E el) { + list.add(el); + } + + public Object pop() { + Object del = list.getTailValue(); + list.removeTail(); + return del; + } +} diff --git a/src/com/walking/lesson39_queue1/task3/Main.java b/src/com/walking/lesson39_queue1/task3/Main.java index 356a857b0..cf1fd0487 100644 --- a/src/com/walking/lesson39_queue1/task3/Main.java +++ b/src/com/walking/lesson39_queue1/task3/Main.java @@ -1,5 +1,7 @@ package com.walking.lesson39_queue1.task3; +import com.walking.lesson39_queue1.task3.list.MyDoublyLinkedList; + /** * Реализуйте двусвязный список. * Реализуйте метод, разворачивающий список. @@ -7,5 +9,17 @@ */ public class Main { public static void main(String[] args) { + MyDoublyLinkedList numbs = new MyDoublyLinkedList<>(); + numbs.addFirst(24); + numbs.addFirst(24); + numbs.addFirst(24); + numbs.addFirst(24); + numbs.addFirst(24); + numbs.addFirst(24); + numbs.addFirst(3); + + System.out.println(numbs); + numbs.removeAll(24); + System.out.println(numbs); } } diff --git a/src/com/walking/lesson39_queue1/task3/list/MyDoublyLinkedList.java b/src/com/walking/lesson39_queue1/task3/list/MyDoublyLinkedList.java new file mode 100644 index 000000000..1c78e22fa --- /dev/null +++ b/src/com/walking/lesson39_queue1/task3/list/MyDoublyLinkedList.java @@ -0,0 +1,201 @@ +package com.walking.lesson39_queue1.task3.list; + +public class MyDoublyLinkedList { + private Node head; + private Node tail; + private int size; + + public MyDoublyLinkedList() { + } + + public MyDoublyLinkedList(E el) { + this.head = new Node<>(el); + this.tail = head; + size++; + } + + public int getSize() { + return size; + } + + public boolean isEmpty() { + return size == 0; + } + + public void addFirst(E el) { + if (isEmpty()) { + this.head = new Node<>(el); + this.tail = head; + } else { + Node newHead = new Node<>(el, null, head); + head.prev = newHead; + head = newHead; + } + size++; + } + + public void addLast(E el) { + if (isEmpty()) { + this.head = new Node<>(el); + this.tail = head; + } else { + Node newTail = new Node<>(el, tail, null); + tail.next = newTail; + tail = newTail; + } + size++; + } + + public void removeFirst() { + if (isEmpty()) { + return; + } + + head = head.next; + if (head != null) { + head.prev = null; + } else { + tail = null; + } + size--; + } + + public void removeLast() { + if (isEmpty()) { + return; + } + + tail = tail.prev; + if (tail != null) { + tail.next = null; + } else { + head = null; + } + size--; + } + + public void removeAll(E el) { + while (!isEmpty() && tail.value.equals(el)) { + removeLast(); + } + + while (!isEmpty() && head.value.equals(el)) { + removeFirst(); + } + + if (!isEmpty()) { + Node current = tail; + Node previous = tail.prev; + while (previous != null) { + if (previous.value.equals(el)) { + current.prev = previous.prev; + current.prev.next = current; + size--; + } + current = current.prev; + previous = current.prev; + } + } + } + + public boolean contains(Object o) { + Node el = tail; + + while (el != null) { + if (o.equals(el.value)) { + return true; + } + el = el.prev; + } + return false; + } + + public int countOccurrences(E el) { + Node current = tail; + int amount = 0; + while (current != null) { + if (current.value.equals(el)) { + amount++; + } + current = current.prev; + } + return amount; + } + + public void reverse() { + Node current = head; + head = tail; + tail = current; + + while (current != null) { + Node temp = current.next; + current.next = current.prev; + current.prev = temp; + + current = temp; + } + } + + public void removeEvenHashCodes() { + if (isEmpty()) { + return; + } + + while (!isEmpty() && tail.hashCode() % 2 == 0) { + removeLast(); + } + + while (!isEmpty() && head.hashCode() % 2 == 0) { + removeFirst(); + } + + Node current = tail; + while (current != null) { + if (current.hashCode() % 2 == 0) { + current.next.prev = current.prev; + current.prev.next = current.next; + size--; + } + current = current.prev; + } + + } + + public String toString() { + StringBuilder allElements = new StringBuilder(); + Node el = head; + + while (el != null) { + allElements.append(el.value); + if (el.next != null) { + allElements.append(", "); + } + el = el.next; + } + return allElements.toString(); + } + + public Object getHeadValue() { + return head.value; + } + + public Object getTailValue() { + return tail.value; + } + + private static class Node { + private final E value; + Node prev; + Node next; + + private Node(E value) { + this.value = value; + } + + private Node(E value, Node prev, Node next) { + this.value = value; + this.prev = prev; + this.next = next; + } + } +} diff --git a/src/com/walking/lesson39_queue1/task4/Main.java b/src/com/walking/lesson39_queue1/task4/Main.java index 6b8ae7821..ba203b471 100644 --- a/src/com/walking/lesson39_queue1/task4/Main.java +++ b/src/com/walking/lesson39_queue1/task4/Main.java @@ -1,9 +1,18 @@ package com.walking.lesson39_queue1.task4; +import com.walking.lesson39_queue1.task4.queue.MyQueue; + /** * Реализуйте одностороннюю очередь на базе двусвязного списка из Задачи 3. */ public class Main { public static void main(String[] args) { + MyQueue myQueue = new MyQueue<>(12); + myQueue.push(34); + myQueue.push(55); + + System.out.println(myQueue.pop()); + myQueue.pop(); + System.out.println(myQueue.peek()); } } diff --git a/src/com/walking/lesson39_queue1/task4/queue/MyQueue.java b/src/com/walking/lesson39_queue1/task4/queue/MyQueue.java new file mode 100644 index 000000000..77d4aa63a --- /dev/null +++ b/src/com/walking/lesson39_queue1/task4/queue/MyQueue.java @@ -0,0 +1,25 @@ +package com.walking.lesson39_queue1.task4.queue; + +import com.walking.lesson39_queue1.task3.list.MyDoublyLinkedList; + +public class MyQueue { + private final MyDoublyLinkedList list; + + public MyQueue(E el) { + this.list = new MyDoublyLinkedList<>(el); + } + + public Object pop() { + Object value = list.getHeadValue(); + list.removeFirst(); + return value; + } + + public void push(E el) { + list.addLast(el); + } + + public Object peek() { + return list.getHeadValue(); + } +} diff --git a/src/com/walking/lesson40_queue2/Main.java b/src/com/walking/lesson40_queue2/Main.java index 680b28259..d9d56272e 100644 --- a/src/com/walking/lesson40_queue2/Main.java +++ b/src/com/walking/lesson40_queue2/Main.java @@ -1,5 +1,10 @@ package com.walking.lesson40_queue2; +import com.walking.lesson40_queue2.model.Task; +import com.walking.lesson40_queue2.service.TaskService; + +import java.util.Scanner; + /** * Реализуйте класс Задание. Он должен содержать поле Название, * состав остальных полей - на ваше усмотрение. @@ -15,5 +20,22 @@ */ public class Main { public static void main(String[] args) { + TaskService tasks = createTaskPool(); + while(tasks.getAmount() != 0) { + Scanner in = new Scanner(System.in); + System.out.println(tasks.get().getName()); + int answer = in.nextInt(); + tasks.complete(answer); + } + + } + + public static TaskService createTaskPool() { + TaskService tasks = new TaskService(); + tasks.add(new Task("Корень из 576", 24)); + tasks.add(new Task("32 в квадрате", 1024)); + tasks.add(new Task("12 в квадрате", 144)); + + return tasks; } } 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..9491f6cbb --- /dev/null +++ b/src/com/walking/lesson40_queue2/model/Task.java @@ -0,0 +1,19 @@ +package com.walking.lesson40_queue2.model; + +public class Task { + private final String name; + private final int answer; + + public Task(String name, int answer) { + this.name = name; + this.answer = answer; + } + + public String getName() { + return name; + } + + public int getAnswer() { + return answer; + } +} 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..28996d77f --- /dev/null +++ b/src/com/walking/lesson40_queue2/service/TaskService.java @@ -0,0 +1,42 @@ +package com.walking.lesson40_queue2.service; + +import com.walking.lesson40_queue2.model.Task; + +import java.util.LinkedList; +import java.util.Queue; + +public class TaskService { + private final Queue tasks; + private int amount; + + public TaskService() { + this.tasks = new LinkedList<>(); + } + + public void add(Task task) { + tasks.add(task); + amount++; + System.out.printf("Задание '%s' добавлено.%n", task.getName()); + } + + public void complete(int answer) { + Task completedTask = get(); + if (completedTask == null) { + System.out.println("Все задания выполнены."); + } else if (completedTask.getAnswer() == answer) { + tasks.remove(); + amount--; + System.out.printf("Задание '%s' выполнено.%n", completedTask.getName()); + } else { + System.out.println("Ответ неверный."); + } + } + + public Task get() { + return tasks.peek(); + } + + public int getAmount() { + return amount; + } +} diff --git a/src/com/walking/lesson41_set/task1/Main.java b/src/com/walking/lesson41_set/task1/Main.java index 634eca5f2..7a4826e68 100644 --- a/src/com/walking/lesson41_set/task1/Main.java +++ b/src/com/walking/lesson41_set/task1/Main.java @@ -1,5 +1,12 @@ package com.walking.lesson41_set.task1; + +import com.walking.lesson41_set.task1.model.Task; +import com.walking.lesson41_set.task1.service.TaskService; +import com.walking.lesson41_set.task1.service.TaskService2; + +import java.util.Scanner; + /** * Реализуйте задачу * ..., @@ -9,5 +16,22 @@ */ public class Main { public static void main(String[] args) { + TaskService2 tasks = createTaskPool(); + while(tasks.getAmount() != 0) { + Scanner in = new Scanner(System.in); + System.out.println(tasks.getFirst().getName()); + int answer = in.nextInt(); + System.out.println(tasks.complete(answer)); + } + System.out.println("Все задания выполнены!"); + } + + public static TaskService2 createTaskPool() { + TaskService2 tasks = new TaskService2(); + tasks.add(new Task("Корень из 576", 24)); + tasks.add(new Task("32 в квадрате", 1024)); + tasks.add(new Task("12 в квадрате", 144)); + + return tasks; } } 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..5db3c078b --- /dev/null +++ b/src/com/walking/lesson41_set/task1/model/Task.java @@ -0,0 +1,28 @@ +package com.walking.lesson41_set.task1.model; + +public class Task { + private final String name; + private final int answer; + private int number; + + public Task(String name, int answer) { + this.name = name; + this.answer = answer; + } + + public String getName() { + return name; + } + + public void setNumber(int number) { + this.number = number; + } + + public int getNumber() { + return number; + } + + public int getAnswer() { + return answer; + } +} 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..90ccba931 --- /dev/null +++ b/src/com/walking/lesson41_set/task1/service/TaskService.java @@ -0,0 +1,47 @@ +package com.walking.lesson41_set.task1.service; + +import com.walking.lesson41_set.task1.model.Task; + +import java.util.LinkedHashSet; +import java.util.NoSuchElementException; + +public class TaskService { + private final LinkedHashSet tasks; + private int amount; + + public TaskService() { + this.tasks = new LinkedHashSet<>(); + } + + public void add(Task task) { + tasks.add(task); + amount++; + System.out.printf("Задание '%s' добавлено.%n", task.getName()); + } + + public String complete(int answer) { + Task completedTask = get(); + if (completedTask == null) { + return "Все задания выполнены."; + } + if (completedTask.getAnswer() == answer) { + tasks.removeFirst(); + amount--; + return "Задание '%s' выполнено.%n".formatted(completedTask.getName()); + } + return "Ответ неверный."; + + } + + public Task get() { + try { + return tasks.getFirst(); + } catch (NoSuchElementException e) { + return null; + } + } + + public int getAmount() { + return amount; + } +} diff --git a/src/com/walking/lesson41_set/task1/service/TaskService2.java b/src/com/walking/lesson41_set/task1/service/TaskService2.java new file mode 100644 index 000000000..382318e6f --- /dev/null +++ b/src/com/walking/lesson41_set/task1/service/TaskService2.java @@ -0,0 +1,53 @@ +package com.walking.lesson41_set.task1.service; + +import com.walking.lesson41_set.task1.model.Task; + +import java.util.Comparator; +import java.util.NoSuchElementException; +import java.util.TreeSet; + +public class TaskService2 { + private final TreeSet tasks; + private int amount; + + public TaskService2() { + this.tasks = new TreeSet<>(new Comparator() { + @Override + public int compare(Task t1, Task t2) { + return t1.getNumber() - t2.getNumber(); + } + }); + } + + public void add(Task task) { + amount++; + task.setNumber(amount); + tasks.add(task); + System.out.printf("Задание '%s' добавлено.%n", task.getName()); + } + + public String complete(int answer) { + Task completedTask = getFirst(); + if (completedTask == null) { + return "Все задания выполнены."; + } + if (completedTask.getAnswer() == answer) { + tasks.remove(completedTask); + amount--; + return "Задание '%s' выполнено.%n".formatted(completedTask.getName()); + } + return "Ответ неверный."; + } + + public Task getFirst() { + try { + return tasks.first(); + } catch (NoSuchElementException e) { + return null; + } + } + + public int getAmount() { + return amount; + } +} diff --git a/src/com/walking/lesson41_set/task2/Main.java b/src/com/walking/lesson41_set/task2/Main.java index da8e67044..c4e1d2efb 100644 --- a/src/com/walking/lesson41_set/task2/Main.java +++ b/src/com/walking/lesson41_set/task2/Main.java @@ -1,5 +1,10 @@ package com.walking.lesson41_set.task2; +import java.util.Arrays; +import java.util.HashSet; +import java.util.Scanner; +import java.util.Set; + /** * Реализуйте задачу * ..., @@ -7,5 +12,19 @@ */ public class Main { public static void main(String[] args) { + Scanner in = new Scanner(System.in); + System.out.print("Введите фразу: "); + String phrase = in.nextLine(); + + Set uniqueWords = getUniqueWords(phrase); + System.out.printf("Найдено уникальных слов: %d", uniqueWords.size()); + } + + public static Set getUniqueWords(String phrase) { + String[] words = phrase.trim() + .toLowerCase() + .split(" "); + + return new HashSet<>(Arrays.asList(words)); } } diff --git a/src/com/walking/lesson42_tree/task1/Main.java b/src/com/walking/lesson42_tree/task1/Main.java index 082700c06..dd3b5eeb3 100644 --- a/src/com/walking/lesson42_tree/task1/Main.java +++ b/src/com/walking/lesson42_tree/task1/Main.java @@ -1,5 +1,8 @@ package com.walking.lesson42_tree.task1; +import com.walking.lesson42_tree.task1.tree.BinaryTree; + + /** * Реализуйте бинарное дерево поиска. Учтите возможность использования дерева как для Comparable-сущностей, * так и для сортировки на основе компаратора. @@ -15,5 +18,27 @@ */ public class Main { public static void main(String[] args) { + BinaryTree numbs = new BinaryTree<>(); + numbs.add(32); + numbs.add(46); + numbs.add(17); + numbs.add(10); + numbs.add(23); + numbs.add(56); + numbs.add(54); + numbs.add(55); + numbs.add(47); + numbs.add(73); + numbs.add(64); + + numbs.delete(56); + numbs.add(87); + + System.out.println(numbs.bypassPreorder()); + + numbs.balance(); + + System.out.println(numbs.bypassPreorder()); + System.out.println(numbs.bypassBreadthFirst()); } } diff --git a/src/com/walking/lesson42_tree/task1/tree/BinaryTree.java b/src/com/walking/lesson42_tree/task1/tree/BinaryTree.java new file mode 100644 index 000000000..e19ea7f0f --- /dev/null +++ b/src/com/walking/lesson42_tree/task1/tree/BinaryTree.java @@ -0,0 +1,170 @@ +package com.walking.lesson42_tree.task1.tree; + +import java.util.*; + +public class BinaryTree { + private Node root; + private Comparator comparator; + + public BinaryTree() { + + } + + public BinaryTree(Comparator comparator) { + this.comparator = comparator; + } + + public boolean isEmpty() { + return root == null; + } + + public void clear() { + root = null; + } + + public E add(E el) { + if (isEmpty()) { + compare(el, el); + root = new Node<>(el); + } else { + add(el, root); + } + return el; + } + + public E delete(E el) { + return (isEmpty()) ? null : delete(el, root).value; + + } + + public List bypassPreorder() { + List list = new ArrayList<>(); + bypassPreorder(root, list); + return list; + } + + public List bypassBreadthFirst() { + List list = new ArrayList<>(); + Queue> queue = new ArrayDeque<>(); + queue.add(root); + + while (!queue.isEmpty()) { + for (Node node : queue) { + list.add(node.value); + if (node.left != null) { + queue.add(node.left); + } + if (node.right != null) { + queue.add(node.right); + } + queue.remove(); + } + } + return list; + } + + public void balance() { + List list = bypassPreorder(); + + Comparator comparator1 = (comparator != null) + ? comparator + : (Comparator) Comparator.naturalOrder(); + list.sort(comparator1); + + int middle = list.size() / 2; + root = new Node<>(list.get(middle)); + balance(list, middle, list.size()); + balance(list, -1, middle); + } + + private void balance(List list, int low, int high) { + int middleIndex = high - ((high - low) / 2); + add(list.get(middleIndex)); + + if (middleIndex - low > 1) { + balance(list, low, middleIndex); + } + if (high - middleIndex > 1) { + balance(list, middleIndex, high); + } + } + + private void bypassPreorder(Node node, List list) { + list.add(node.value); + if (node.left != null) { + bypassPreorder(node.left, list); + } + if (node.right != null) { + bypassPreorder(node.right, list); + } + } + + private Node add(E el, Node node) { + int compareResult = compare(el, node.value); + + if (compareResult > 0) { + if (node.right == null) { + return node.right = new Node<>(el, node); + } + return add(el, node.right); + } + + if (node.left == null) { + return node.left = new Node<>(el, node); + } + return add(el, node.left); + } + + private Node delete(E el, Node node) { + int compareResult = compare(el, node.value); + Node result = node; + + if (compareResult > 0) { + node.right = delete(el, node.right); + } else if (compareResult < 0) { + node.left = delete(el, node.left); + } else if (node.right != null && node.left != null) { + Node max = findMax(node.left); + node.value = max.value; + delete(max.value, max.parent); + } else if (node.left != null) { + result = node.left.parent = node.parent; + } else if (node.right != null) { + result = node.right.parent = node.parent; + } else { + result = null; + } + + return result; + } + + private Node findMax(Node node) { + return node.right == null ? node : findMax(node.right); + } + + private int compare(E el1, E el2) { + return comparator == null + ? ((Comparable) el1).compareTo(el2) + : comparator.compare(el1, el2); + } + + public E getRootValue() { + return root.value; + } + + private static class Node { + private E value; + Node left; + Node right; + Node parent; + + private Node(E value) { + this.value = value; + } + + private Node(E value, Node parent) { + this.value = value; + this.parent = parent; + } + } +} diff --git a/src/com/walking/lesson42_tree/task2/Main.java b/src/com/walking/lesson42_tree/task2/Main.java index fd124a35a..e8ea37fc6 100644 --- a/src/com/walking/lesson42_tree/task2/Main.java +++ b/src/com/walking/lesson42_tree/task2/Main.java @@ -1,5 +1,7 @@ package com.walking.lesson42_tree.task2; +import com.walking.lesson42_tree.task2.tree.AVLTree; + /** * Реализуйте АВЛ-дерево. * Сопроводите действия по добавлению (и последующей балансировке) @@ -7,5 +9,24 @@ */ public class Main { public static void main(String[] args) { + AVLTree numbs = new AVLTree<>(); + numbs.add(32); + numbs.add(46); + numbs.add(17); + numbs.add(10); + numbs.add(23); + numbs.add(56); + numbs.add(54); + numbs.add(55); + numbs.add(47); + numbs.add(73); + numbs.add(64); + + System.out.println(numbs.bypassPreorder()); + + numbs.delete(46); + numbs.delete(12); + numbs.delete(54); + System.out.println(numbs.bypassPreorder()); } } diff --git a/src/com/walking/lesson42_tree/task2/tree/AVLTree.java b/src/com/walking/lesson42_tree/task2/tree/AVLTree.java new file mode 100644 index 000000000..c4fd3a5df --- /dev/null +++ b/src/com/walking/lesson42_tree/task2/tree/AVLTree.java @@ -0,0 +1,177 @@ +package com.walking.lesson42_tree.task2.tree; + +import java.util.ArrayList; +import java.util.Comparator; +import java.util.List; + +public class AVLTree { + private Node root; + private Comparator comparator; + + public AVLTree() { + } + + public AVLTree(Comparator comparator) { + this.comparator = comparator; + } + + public boolean isEmpty() { + return root == null; + } + + public void add(E el) { + if (isEmpty()) { + compare(el, el); + root = new Node<>(el); + } else { + root = add(el, root); + } + System.out.printf("Элемент %s был добавлен.\n", el); + } + + public void delete(E el) { + if (!isEmpty()) { + root = delete(el, root); + } else { + System.out.println("В дереве отсутствуют элементы."); + } + } + + public List bypassPreorder() { + List list = new ArrayList<>(); + bypassPreorder(root, list); + return list; + } + + private void bypassPreorder(Node node, List list) { + list.add(node.value); + if (node.left != null) { + bypassPreorder(node.left, list); + } + if (node.right != null) { + bypassPreorder(node.right, list); + } + } + + private Node delete(E el, Node node) { + if (node == null) { + System.out.printf("Элемент %s не найден.\n", el); + return null; + } + + int compareResult = compare(el, node.value); + + if (compareResult > 0) { + node.right = delete(el, node.right); + } else if (compareResult < 0) { + node.left = delete(el, node.left); + } else { + Node l = node.left; + Node r = node.right; + System.out.printf("Элемент был %s удалён.\n", el); + if (l == null) { + return r; + } else if (r == null) { + return l; + } + Node max = findMax(node.left); + max.left = removeMax(node.left); + max.right = r; + return balance(max); + } + return balance(node); + } + + private Node removeMax(Node node) { + if (node.right == null) { + return node.left; + } + node.right = removeMax(node.right); + return balance(node); + } + + private Node findMax(Node node) { + return node.right == null ? node : findMax(node.right); + } + + private Node add(E el, Node node) { + if (node == null) { + return new Node<>(el); + } + int compareResult = compare(el, node.value); + if (compareResult > 0) { + node.right = add(el, node.right); + } else { + node.left = add(el, node.left); + } + return balance(node); + } + + private Node balance(Node node) { + fixHeight(node); + if (getBalanceFactor(node) == 2) { + if (getBalanceFactor(node.left) < 0) { + node.left = rotateLeft(node.left); + } + return rotateRight(node); + } + + if (getBalanceFactor(node) == -2) { + if (getBalanceFactor(node.right) > 0) { + node.right = rotateRight(node.right); + } + return rotateLeft(node); + } + return node; + } + + private Node rotateRight(Node node) { + Node node1 = node.left; + node.left = node1.right; + node1.right = node; + fixHeight(node); + fixHeight(node1); + return node1; + } + + private Node rotateLeft(Node node) { + Node node1 = node.right; + node.right = node1.left; + node1.left = node; + fixHeight(node); + fixHeight(node1); + return node1; + } + + private int getBalanceFactor(Node node) { + return getHeight(node.left) - getHeight(node.right); + } + + private void fixHeight(Node node) { + int leftHeight = getHeight(node.left); + int rightHeight = getHeight(node.right); + node.height = Math.max(leftHeight, rightHeight) + 1; + } + + private int getHeight(Node node) { + return node == null ? 0 : node.height; + } + + private int compare(E el1, E el2) { + return comparator == null + ? ((Comparable) el1).compareTo(el2) + : comparator.compare(el1, el2); + } + + private static class Node { + private final E value; + private int height; + Node left; + Node right; + + private Node(E value) { + this.value = value; + this.height = 1; + } + } +} diff --git a/src/com/walking/lesson43_map/task1/Main.java b/src/com/walking/lesson43_map/task1/Main.java index a44e5254b..c1560f2b0 100644 --- a/src/com/walking/lesson43_map/task1/Main.java +++ b/src/com/walking/lesson43_map/task1/Main.java @@ -1,5 +1,11 @@ package com.walking.lesson43_map.task1; +import com.walking.lesson30_regex.task3.exception.InvalidWordException; + +import java.util.HashMap; +import java.util.Map; +import java.util.Scanner; + /** * Реализуйте программу, выводящую в консоль количество использований каждого слова во введенной пользователем строке. *

@@ -7,6 +13,59 @@ * .... */ public class Main { + private static final String WORD = "[а-яa-z]+"; + private static final String WORD_WITH_HYPHENS = "[а-яa-z][а-яa-z-]+[а-яa-z]"; + public static void main(String[] args) { + Scanner in = new Scanner(System.in); + System.out.print("Введите фразу: "); + String phrase = in.nextLine() + .trim() + .toLowerCase(); + + var words = getWordsMap(phrase); + System.out.println(words); + + } + + private static Map getWordsMap(String phrase) { + String[] words = splitPhrase(phrase); + validateWords(words); + + var wordsMap = new HashMap(); + for (String word : words) { + putElement(wordsMap, word); + } + + return wordsMap; + } + + private static void putElement(HashMap map, String key) { + Integer amount = map.getOrDefault(key, 0); + map.put(key, amount + 1); + } + + private static void validateWords(String[] words) { + for (String word : words) { + if (!isWordValid(word)) { + throw new InvalidWordException("Некорректное слово: " + word); + } + } + } + + private static boolean isWordValid(String word) { + if (!word.contains("-")) { + return word.matches(WORD); + } + + if (word.matches("^.*--+.*$")) { + return false; + } + + return word.matches(WORD_WITH_HYPHENS); + } + + private static String[] splitPhrase(String phrase) { + return phrase.split("\\s+"); } } diff --git a/src/com/walking/lesson43_map/task1/exception/InvalidWordException.java b/src/com/walking/lesson43_map/task1/exception/InvalidWordException.java new file mode 100644 index 000000000..48670e91e --- /dev/null +++ b/src/com/walking/lesson43_map/task1/exception/InvalidWordException.java @@ -0,0 +1,7 @@ +package com.walking.lesson43_map.task1.exception; + +public class InvalidWordException extends RuntimeException { + public InvalidWordException(String message) { + super(message); + } +} diff --git a/src/com/walking/lesson43_map/task2/Main.java b/src/com/walking/lesson43_map/task2/Main.java index 77e92e40d..46e955545 100644 --- a/src/com/walking/lesson43_map/task2/Main.java +++ b/src/com/walking/lesson43_map/task2/Main.java @@ -1,5 +1,12 @@ package com.walking.lesson43_map.task2; + +import com.walking.lesson43_map.task2.model.Car; +import com.walking.lesson43_map.task2.model.CarIdentifier; +import com.walking.lesson43_map.task2.service.CarService; + +import java.util.Scanner; + /** * Реализуйте задачу * ..., @@ -8,5 +15,34 @@ */ public class Main { public static void main(String[] args) { + CarService service = createCarsMap(); + CarService service2 = new CarService(service.getCarMap()); + service2.put(new Car("Audi", "кр333о", "Савельев П.Б.", "синий")); + + Scanner in = new Scanner(System.in); + System.out.print("Марка машины: "); + String brand = in.nextLine(); + System.out.print("Номер машины: "); + String number = in.nextLine(); + + CarIdentifier identifier = new CarIdentifier(number, brand); + Car car = service2.get(identifier); + if (car == null) { + System.out.println("Машина не найдена!"); + } else { + System.out.println(car.getInfo()); + } + } + + public static CarService createCarsMap() { + CarService carService = new CarService(); + carService.put(new Car("Audi","уе777к", "Печкин Ф.Б.", "синий")); + carService.put(new Car("Ford","ос025р", "Борисов Ю.А.", "красный")); + carService.put(new Car("BMW","мр666м", "Снегирь Ю.В.", "чёрный")); + carService.put(new Car("BMW","ра345з", "Сергеев К.Л.", "чёрный")); + carService.put(new Car("Москвич","кв865а", "Васильев П.Д.", "белый")); + carService.put(new Car("Audi","ау000ш", "Алексеев Л.Б.", "серый")); + carService.put(new Car("Audi","уе777к", "Печкин Ф.Б.", "жёлтый")); + return carService; } } diff --git a/src/com/walking/lesson43_map/task2/model/Car.java b/src/com/walking/lesson43_map/task2/model/Car.java new file mode 100644 index 000000000..554a28837 --- /dev/null +++ b/src/com/walking/lesson43_map/task2/model/Car.java @@ -0,0 +1,51 @@ +package com.walking.lesson43_map.task2.model; + +public class Car { + private final CarIdentifier identifier; + private String owner; + private String color; + + public Car(CarIdentifier identifier) { + this.identifier = identifier; + } + + public Car(CarIdentifier identifier, String owner, String color) { + this.identifier = identifier; + this.owner = owner; + this.color = color; + } + + public Car(String brand, String number, String owner, String color) { + this.identifier = new CarIdentifier(number, brand); + this.owner = owner; + this.color = color; + } + + public String getInfo() { + return "Машина марки %s, номер: %s, цвет: %s, владелец: %s" + .formatted(identifier.getBrand(), + identifier.getNumber(), + color, + owner); + } + + public CarIdentifier getIdentifier() { + return identifier; + } + + public String getOwner() { + return owner; + } + + public void setOwner(String owner) { + this.owner = owner; + } + + public String getColor() { + return color; + } + + public void setColor(String color) { + this.color = color; + } +} diff --git a/src/com/walking/lesson43_map/task2/model/CarIdentifier.java b/src/com/walking/lesson43_map/task2/model/CarIdentifier.java new file mode 100644 index 000000000..aa85263f5 --- /dev/null +++ b/src/com/walking/lesson43_map/task2/model/CarIdentifier.java @@ -0,0 +1,55 @@ +package com.walking.lesson43_map.task2.model; + +public class CarIdentifier implements Comparable { + private final String number; + private final String brand; + + public CarIdentifier(String number, String brand) { + this.number = number; + this.brand = brand; + } + + @Override + public int compareTo(CarIdentifier o) { + int result = brand.compareTo(o.brand); + if (result == 0) { + result = number.compareTo(o.number); + } + return result; + } + + @Override + public boolean equals(Object car) { + if (this == car) { + return true; + } + + if (car == null) { + return false; + } + + if (!getClass().equals(car.getClass())) { + return false; + } + + CarIdentifier c = (CarIdentifier) car; + + return number.equals(c.number) && brand.equals(c.brand); + } + + @Override + public int hashCode() { + int result = brand != null ? brand.hashCode() : 0; + result *= 31 + (number != null ? number.hashCode() : 0); + + return result; + } + + public String getBrand() { + return brand; + } + + public String getNumber() { + return number; + } +} diff --git a/src/com/walking/lesson43_map/task2/service/CarService.java b/src/com/walking/lesson43_map/task2/service/CarService.java new file mode 100644 index 000000000..9eebc243d --- /dev/null +++ b/src/com/walking/lesson43_map/task2/service/CarService.java @@ -0,0 +1,35 @@ +package com.walking.lesson43_map.task2.service; + +import com.walking.lesson43_map.task2.model.Car; +import com.walking.lesson43_map.task2.model.CarIdentifier; + +import java.util.HashMap; +import java.util.Map; + +public class CarService { + private final Map carMap; + + public CarService() { + this.carMap = new HashMap<>(); + } + + public CarService(Map carMap) { + this.carMap = new HashMap<>(carMap); + } + + public Car put(Car car) { + return carMap.put(car.getIdentifier(), car); + } + + public Car remove(Car car) { + return carMap.remove(car.getIdentifier()); + } + + public Car get(CarIdentifier identifier) { + return carMap.get(identifier); + } + + public Map getCarMap() { + return Map.copyOf(carMap); + } +}