diff --git a/src/com/walking/lesson43_map/task1/Main.java b/src/com/walking/lesson43_map/task1/Main.java
index 64219f7f2..e82b83fe7 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.lesson43_map.task1.exception.RegexValidationException;
+
+import java.util.HashMap;
+import java.util.Map;
+import java.util.Scanner;
+
/**
* Реализуйте программу, выводящую в консоль количество использований каждого из уникальных слов
* во введенной пользователем строке.
@@ -8,6 +14,71 @@
* ....
*/
public class Main {
+ public static final String WORDS_REGEX = "[a-z-\\s]+";
+ public static final String COMPLEX_WORD_REGEX = "[a-z][a-z-]+[a-z]";
+ public static final String WORD_REGEX = "[a-z]+";
+
public static void main(String[] args) {
+ String words = getStringFromUser();
+
+ if (!words.matches(WORDS_REGEX)) {
+ throw new RegexValidationException(words, WORDS_REGEX);
+ }
+
+ Map wordOccurrences = getWordOccurrences(words);
+ printWordOccurrences(wordOccurrences);
+ }
+
+ public static String getStringFromUser() {
+ System.out.println("Введите строку, содержащую слова, разделенные пробелом:");
+
+ Scanner scanner = new Scanner(System.in);
+
+ String words = scanner.nextLine()
+ .trim()
+ .toLowerCase();
+
+ scanner.close();
+
+ return words;
+ }
+
+ private static Map getWordOccurrences(String words) {
+ Map wordOccurrences = new HashMap<>();
+ Integer currentWordOccurrence;
+
+ for (String word : words.split("\\s+")) {
+ validateWord(word);
+ currentWordOccurrence = wordOccurrences.getOrDefault(word, 0);
+ wordOccurrences.put(word, ++currentWordOccurrence);
+ }
+
+ return wordOccurrences;
+ }
+
+ private static void validateWord(String word) {
+ if (word.contains("-")) {
+ if (!word.matches(COMPLEX_WORD_REGEX)) {
+ throw new RegexValidationException(word, COMPLEX_WORD_REGEX);
+ }
+
+ for (String wordPart : word.split("-")) {
+ validateSimpleWord(wordPart);
+ }
+ } else {
+ validateSimpleWord(word);
+ }
+ }
+
+ private static void validateSimpleWord(String word) {
+ if (!word.matches(WORD_REGEX)) {
+ throw new RegexValidationException(word, WORD_REGEX);
+ }
+ }
+
+ private static void printWordOccurrences(Map wordOccurrences) {
+ for (Map.Entry stringIntegerEntry : wordOccurrences.entrySet()) {
+ System.out.printf("%s - %s\n", stringIntegerEntry.getKey(), stringIntegerEntry.getValue());
+ }
}
-}
+}
\ No newline at end of file
diff --git a/src/com/walking/lesson43_map/task1/exception/RegexValidationException.java b/src/com/walking/lesson43_map/task1/exception/RegexValidationException.java
new file mode 100644
index 000000000..5ef6af92f
--- /dev/null
+++ b/src/com/walking/lesson43_map/task1/exception/RegexValidationException.java
@@ -0,0 +1,7 @@
+package com.walking.lesson43_map.task1.exception;
+
+public class RegexValidationException extends RuntimeException {
+ public RegexValidationException(String str, String regex) {
+ super("%s not matches to '%s'".formatted(str, regex));
+ }
+}
\ No newline at end of file
diff --git a/src/com/walking/lesson43_map/task2/Main.java b/src/com/walking/lesson43_map/task2/Main.java
index 77e92e40d..626828c30 100644
--- a/src/com/walking/lesson43_map/task2/Main.java
+++ b/src/com/walking/lesson43_map/task2/Main.java
@@ -1,5 +1,10 @@
package com.walking.lesson43_map.task2;
+import com.walking.lesson43_map.task2.model.Car;
+import com.walking.lesson43_map.task2.service.CarService;
+
+import java.util.Scanner;
+
/**
* Реализуйте задачу
* ...,
@@ -8,5 +13,46 @@
*/
public class Main {
public static void main(String[] args) {
+ CarService carService = new CarService(initCars());
+
+ Car desiredCar = createCar();
+ Car foundCar = carService.findCar(desiredCar);
+
+ System.out.println(foundCar);
+ }
+
+ private static Car createCar() {
+ Scanner scanner = new Scanner(System.in);
+
+ System.out.println("Enter a car's number");
+ String number = scanner.nextLine();
+
+ System.out.println("Enter a car's color");
+ String color = scanner.nextLine();
+
+ System.out.println("Enter a car's year");
+ int year = scanner.nextInt();
+
+ System.out.println("Enter a actuality of technical inspection");
+ boolean actualTechnicalInspection = scanner.nextBoolean();
+
+ scanner.close();
+
+ return new Car(number, year, color, actualTechnicalInspection);
+ }
+
+ private static Car[] initCars() {
+ Car car1 = new Car("RR-111-RR", 2015, "yellow", true);
+ Car car2 = new Car("RR-222-RR", 2016, "yellow", true);
+ Car car3 = new Car("RR-333-RR", 2017, "yellow", true);
+ Car car4 = new Car("RR-444-RR", 2018, "yellow", true);
+ Car car5 = new Car("RR-555-RR", 2018, "yellow", true);
+ Car car6 = new Car("RR-777-RR", 2015, "yellow", true);
+ Car car7 = new Car("RR-777-RR", 2018, "yellow", true);
+ Car car8 = new Car("RR-888-RR", 2018, "yellow", true);
+ Car car9 = new Car("RR-999-RR", 2018, "yellow", true);
+ Car car10 = new Car("RR-000-RR", 2018, "yellow", true);
+
+ return new Car[]{car1, car2, car3, car4, car5, car6, car7, car8, car9, car10};
}
}
diff --git a/src/com/walking/lesson43_map/task2/model/Car.java b/src/com/walking/lesson43_map/task2/model/Car.java
new file mode 100644
index 000000000..482124459
--- /dev/null
+++ b/src/com/walking/lesson43_map/task2/model/Car.java
@@ -0,0 +1,45 @@
+package com.walking.lesson43_map.task2.model;
+
+
+public class Car {
+ private final CarIdentifier identifier;
+
+ private String color;
+ private boolean actualTechnicalInspection;
+
+ public Car(String number, int year, String color, boolean actualTechnicalInspection) {
+ this(new CarIdentifier(number, year), color, actualTechnicalInspection);
+ }
+
+ public Car(CarIdentifier identifier, String color, boolean actualTechnicalInspection) {
+ this.identifier = identifier;
+ this.color = color;
+ this.actualTechnicalInspection = actualTechnicalInspection;
+ }
+
+ public CarIdentifier getIdentifier() {
+ return identifier;
+ }
+
+ public String getColor() {
+ return color;
+ }
+
+ public void setColor(String color) {
+ this.color = color;
+ }
+
+ public boolean isActualTechnicalInspection() {
+ return actualTechnicalInspection;
+ }
+
+ public void setActualTechnicalInspection(boolean actualTechnicalInspection) {
+ this.actualTechnicalInspection = actualTechnicalInspection;
+ }
+
+ @Override
+ public String toString() {
+ return "number: %s | year: %d | color: %s | actualTechnicalInspection: %s".formatted(identifier.getNumber(),
+ identifier.getYear(), color, actualTechnicalInspection ? "actual" : "not actual");
+ }
+}
\ No newline at end of file
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..8f9c44e58
--- /dev/null
+++ b/src/com/walking/lesson43_map/task2/model/CarIdentifier.java
@@ -0,0 +1,44 @@
+package com.walking.lesson43_map.task2.model;
+
+import java.util.Objects;
+
+public class CarIdentifier {
+ private final String number;
+ private final int year;
+
+ public CarIdentifier(String number, int year) {
+ this.number = number;
+ this.year = year;
+ }
+
+ public String getNumber() {
+ return number;
+ }
+
+ public int getYear() {
+ return year;
+ }
+
+ @Override
+ public boolean equals(Object o) {
+ if (this == o) {
+ return true;
+ }
+
+ if (o == null || !getClass().equals(o.getClass())) {
+ return false;
+ }
+
+ CarIdentifier identifier = (CarIdentifier) o;
+
+ return year == identifier.year && Objects.equals(number, identifier.number);
+ }
+
+ @Override
+ public int hashCode() {
+ int hashcode = number.hashCode();
+ hashcode += 31 * year;
+
+ return hashcode;
+ }
+}
\ No newline at end of file
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..04b1b7d7d
--- /dev/null
+++ b/src/com/walking/lesson43_map/task2/service/CarService.java
@@ -0,0 +1,21 @@
+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 cars = new HashMap<>();
+
+ public CarService(Car[] cars) {
+ for (Car car : cars) {
+ this.cars.put(car.getIdentifier(), car);
+ }
+ }
+
+ public Car findCar(Car car) {
+ return cars.getOrDefault(car.getIdentifier(), null);
+ }
+}