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); + } +}