From 6c5a20f9c00107c83ed816c96dfb6d2d4ec87729 Mon Sep 17 00:00:00 2001 From: davidbilalov Date: Fri, 7 Nov 2025 21:48:29 +0300 Subject: [PATCH 1/2] =?UTF-8?q?feat/davidbilalov/input=20=D0=95=D1=81?= =?UTF-8?q?=D1=82=D1=8C=20=D0=BF=D1=80=D0=BE=D0=B1=D0=BB=D0=B5=D0=BC=D1=8B?= =?UTF-8?q?=20=D1=81=20=D0=BA=D0=B8=D1=80=D0=B8=D0=BB=D0=B8=D1=86=D0=B5?= =?UTF-8?q?=D0=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- CarList | 3 + build.gradle | 7 ++ src/main/java/team/shellsort/App.java | 103 +++++++++--------- .../shellsort/input/ConsoleDataProvider.java | 61 ++++------- .../team/shellsort/input/DataProvider.java | 7 ++ .../shellsort/input/FileDataProvider.java | 34 +++++- .../java/team/shellsort/input/LineParser.java | 37 +++---- .../java/team/shellsort/input/LoadResult.java | 2 + .../shellsort/input/RandomDataProvider.java | 43 +++++++- 9 files changed, 180 insertions(+), 117 deletions(-) create mode 100644 CarList create mode 100644 src/main/java/team/shellsort/input/DataProvider.java diff --git a/CarList b/CarList new file mode 100644 index 0000000..f3ca7ef --- /dev/null +++ b/CarList @@ -0,0 +1,3 @@ +Almera;2005;75 +Focus;2009;110 +Corolla;2014;90 \ No newline at end of file diff --git a/build.gradle b/build.gradle index 8e3d9bc..6ccf68a 100644 --- a/build.gradle +++ b/build.gradle @@ -23,3 +23,10 @@ dependencies { test { useJUnitPlatform() } +compileJava.options.encoding = 'UTF-8' // устанавливает кодировку для компилируемого кода +javadoc.options.encoding = 'UTF-8' // устанавливает кодировку для генерируемой документации +compileTestJava.options.encoding = 'UTF-8' + +tasks.withType(JavaCompile) { + options.encoding = 'UTF-8' +} \ No newline at end of file diff --git a/src/main/java/team/shellsort/App.java b/src/main/java/team/shellsort/App.java index 096c7e1..0cb5e42 100644 --- a/src/main/java/team/shellsort/App.java +++ b/src/main/java/team/shellsort/App.java @@ -1,5 +1,8 @@ package team.shellsort; +import team.shellsort.input.ConsoleDataProvider; +import team.shellsort.input.FileDataProvider; +import team.shellsort.input.RandomDataProvider; import team.shellsort.model.Car; import team.shellsort.strategy.ByModel; import team.shellsort.strategy.ByPower; @@ -46,7 +49,7 @@ public class App { */ public static void main(String[] args) { System.out.println("=== ShellSort App (черновик интеграции) ==="); - runMenuLoop(); +// runMenuLoop(); System.out.println("Завершено. До встречи!"); } @@ -56,41 +59,41 @@ public static void main(String[] args) { * *

Цикл продолжается, пока пользователь не выберет пункт «Выход». */ - private static void runMenuLoop() { - while (true) { - int source = askSource(); - if (source == 0) { - break; - } - - int limit = askInt("Введите количество элементов (1..1000): ", 1, 1000); - SortStrategy strategy = askStrategy(); - - // ===== Загрузка данных ===== - // TODO (Давид + Артём): заменить mock на реальные провайдеры после интеграции Validator’а - // Пример будущего кода: - // DataProvider dp = switch (source) { - // case 1 -> new ConsoleDataProvider(SC, new LineParser()); - // case 2 -> new FileDataProvider(/* path или запрос пути */); - // case 3 -> new RandomDataProvider(/* seed? */); - // case 4 -> new MockDataProviderAdapter(); // если захотим оставить mock - // default -> throw new IllegalStateException("Неожиданный источник: " + source); - // }; - // LoadResult lr = dp.load(); // либо dp.load(limit), если финальная сигнатура с лимитом - // List cars = lr.validCars(); // имя метода — как договоримся - List cars = loadMockData(limit); - - // ===== Сортировка ===== - cars.sort(strategy.comparator()); - - // ===== Вывод ===== - printCars(cars); - - if (!askYesNo("Ещё раз? (y/n): ")) { - break; - } - } - } +// private static void runMenuLoop() { +// while (true) { +// int source = askSource(); +// if (source == 0) { +// break; +// } +// +// int limit = askInt("Введите количество элементов (1..1000): ", 1, 1000); +// SortStrategy strategy = askStrategy(); +// +// // ===== Загрузка данных ===== +// // TODO (Давид + Артём): заменить mock на реальные провайдеры после интеграции Validator’а +// // Пример будущего кода: +// // DataProvider dp = switch (source) { +// // case 1 -> new ConsoleDataProvider(SC, new LineParser()); +// // case 2 -> new FileDataProvider(/* path или запрос пути */); +// // case 3 -> new RandomDataProvider(/* seed? */); +// // case 4 -> new MockDataProviderAdapter(); // если захотим оставить mock +// // default -> throw new IllegalStateException("Неожиданный источник: " + source); +// // }; +// // LoadResult lr = dp.load(); // либо dp.load(limit), если финальная сигнатура с лимитом +// // List cars = lr.validCars(); // имя метода — как договоримся +// List cars = loadMockData(limit); +// +// // ===== Сортировка ===== +// cars.sort(strategy.comparator()); +// +// // ===== Вывод ===== +// printCars(cars); +// +// if (!askYesNo("Ещё раз? (y/n): ")) { +// break; +// } +// } +// } /** * Отображает меню выбора источника данных и возвращает выбранный пункт. @@ -129,20 +132,20 @@ private static int askSource() { * * @return выбранная стратегия сортировки */ - private static SortStrategy askStrategy() { - System.out.println(); - System.out.println("Выберите стратегию сортировки:"); - System.out.println(" 1) По модели (ignore case, nulls last) -> год -> мощность"); - System.out.println(" 2) По мощности -> модель (ignore case) -> год"); - System.out.println(" 3) По году -> модель (ignore case) -> мощность"); - int choice = askInt("Ваш выбор: ", 1, 3); - return switch (choice) { - case 1 -> new ByModel(); - case 2 -> new ByPower(); - case 3 -> new ByYear(); - default -> throw new IllegalStateException("Неожиданный выбор: " + choice); - }; - } +// private static SortStrategy askStrategy() { +// System.out.println(); +// System.out.println("Выберите стратегию сортировки:"); +// System.out.println(" 1) По модели (ignore case, nulls last) -> год -> мощность"); +// System.out.println(" 2) По мощности -> модель (ignore case) -> год"); +// System.out.println(" 3) По году -> модель (ignore case) -> мощность"); +// int choice = askInt("Ваш выбор: ", 1, 3); +// return switch (choice) { +// case 1 -> new ByModel(); +// case 2 -> new ByPower(); +// case 3 -> new ByYear(); +// default -> throw new IllegalStateException("Неожиданный выбор: " + choice); +// }; +// } /** * Создаёт и возвращает список тестовых объектов {@code Car}. diff --git a/src/main/java/team/shellsort/input/ConsoleDataProvider.java b/src/main/java/team/shellsort/input/ConsoleDataProvider.java index f1134dc..b0bc956 100644 --- a/src/main/java/team/shellsort/input/ConsoleDataProvider.java +++ b/src/main/java/team/shellsort/input/ConsoleDataProvider.java @@ -1,5 +1,7 @@ package team.shellsort.input; +import team.shellsort.model.Car; + import java.io.IOException; import java.util.ArrayList; import java.util.List; @@ -7,56 +9,31 @@ public class ConsoleDataProvider implements DataProvider { - private static final String STOP_COMMAND = "stop"; - private final Scanner scanner; - public ConsoleDataProvider(Scanner scanner) { - this.scanner = scanner; - } - @Override - public LoadResult load() throws IOException { - List validCars = new ArrayList<>(); - List invalidLines = new ArrayList<>(); - LineParser parser = new LineParser(); - - System.out.println("-----------------------------------------------------"); - System.out.println("ВВОД С КОНСОЛИ (Формат: Модель;Мощность;Год)"); - System.out.println("Укажите количество элементов (например, 5):"); - - int count; - try { - count = Integer.parseInt(scanner.nextLine().trim()); - } catch (NumberFormatException e) { - System.err.println("Ошибка: Введено неверное число."); - return new LoadResult(validCars, invalidLines); - } + public LoadResult load() { - System.out.printf("Ожидается %d строк. Для досрочного завершения введите '%s'.\n", count, STOP_COMMAND); + List listCars = new ArrayList(); + List invalidLines = new ArrayList<>(); - // 2. Построчный ввод - for (int i = 0; i < count; i++) { - System.out.printf("Введите строку %d/%d: ", i + 1, count); + try (Scanner scanner = new Scanner(System.in)) { + System.out.println("Для выхода введите \"stop\""); + while (scanner.hasNextLine()) { + System.out.println("Формат ввода \"model;power;year\""); - // Проверка, есть ли еще ввод (на всякий случай) - if (!scanner.hasNextLine()) { - break; - } - String line = scanner.nextLine(); + String line = scanner.nextLine(); - if (line == null || line.trim().equalsIgnoreCase(STOP_COMMAND)) { - System.out.println("Ввод досрочно завершен командой 'stop'."); - break; - } + if (line.isEmpty() || line.equals("stop")) { + break; + } - Car car = parser.parse(line); + if (Validator.isValid(LineParser.parse(line))){ + listCars.add(LineParser.parse(line)); + }else { + invalidLines.add(line); + } - if (car != null) { - validCars.add(car); - } else { - invalidLines.add(line); } } - - return new LoadResult(validCars, invalidLines); + return new LoadResult(listCars, invalidLines); } } diff --git a/src/main/java/team/shellsort/input/DataProvider.java b/src/main/java/team/shellsort/input/DataProvider.java new file mode 100644 index 0000000..76a5922 --- /dev/null +++ b/src/main/java/team/shellsort/input/DataProvider.java @@ -0,0 +1,7 @@ +package team.shellsort.input; + +import java.io.IOException; + +public interface DataProvider { + LoadResult load() throws IOException; +} diff --git a/src/main/java/team/shellsort/input/FileDataProvider.java b/src/main/java/team/shellsort/input/FileDataProvider.java index a5dcf95..ecadc5b 100644 --- a/src/main/java/team/shellsort/input/FileDataProvider.java +++ b/src/main/java/team/shellsort/input/FileDataProvider.java @@ -1,9 +1,39 @@ package team.shellsort.input; +import team.shellsort.model.Car; + +import java.io.BufferedReader; +import java.io.FileReader; +import java.io.IOException; +import java.util.ArrayList; +import java.util.List; + public class FileDataProvider implements DataProvider { + private static final String FILENAME = "CarList"; @Override - public LoadResult load(int limit) { + public LoadResult load() { // TODO: реализовать чтение данных из файла - return null; + + List listCars = new ArrayList<>(); + List invalidLines = new ArrayList<>(); + String line; + try (BufferedReader reader = new BufferedReader(new FileReader(FILENAME))) { + + + while ((line = reader.readLine()) != null) { + + if (Validator.isValid(LineParser.parse(line))){ + listCars.add(LineParser.parse(line)); + }else { + invalidLines.add(line); + } + + } + } catch (IOException e) { + invalidLines.add(e.getMessage()); + } + + return new LoadResult(listCars, invalidLines); } + } diff --git a/src/main/java/team/shellsort/input/LineParser.java b/src/main/java/team/shellsort/input/LineParser.java index e0c98d9..b2d5881 100644 --- a/src/main/java/team/shellsort/input/LineParser.java +++ b/src/main/java/team/shellsort/input/LineParser.java @@ -1,34 +1,29 @@ package team.shellsort.input; +import team.shellsort.model.Car; + public class LineParser { private static final String SEPARATOR = ";"; - public Car parse(String line) { - if (line == null || line.trim().isEmpty()) { - return null; - } + public static Car parse(String line) { + // TODO: реализовать парсинг строки вида "model;power;year" - String[] parts = line.split(SEPARATOR); - if (parts.length != 3) { - return null; - } + String[] tokens = line.split(SEPARATOR); - try { - String model = parts[0].trim(); - int power = Integer.parseInt(parts[1].trim()); - int year = Integer.parseInt(parts[2].trim()); + String model; + int year; + int power; - Car car = new Car(model, power, year); + try{ + model = tokens[0]; + year = Integer.parseInt(tokens[1]); + power = Integer.parseInt(tokens[2]); + } catch(Exception e){ + return new Car.CarBuilder().setModel("").setYear(0).setPower(0).build(); + } - if (Validator.isValid(car)) { - return car; - } else { - return null; - } + return new Car.CarBuilder().setModel(model).setYear(year).setPower(power).build(); - } catch (NumberFormatException e) { - return null; - } } } diff --git a/src/main/java/team/shellsort/input/LoadResult.java b/src/main/java/team/shellsort/input/LoadResult.java index 2f0a617..9eea1d8 100644 --- a/src/main/java/team/shellsort/input/LoadResult.java +++ b/src/main/java/team/shellsort/input/LoadResult.java @@ -1,5 +1,7 @@ package team.shellsort.input; +import team.shellsort.model.Car; + import java.util.Collections; import java.util.List; diff --git a/src/main/java/team/shellsort/input/RandomDataProvider.java b/src/main/java/team/shellsort/input/RandomDataProvider.java index 546a830..5111309 100644 --- a/src/main/java/team/shellsort/input/RandomDataProvider.java +++ b/src/main/java/team/shellsort/input/RandomDataProvider.java @@ -1,9 +1,48 @@ package team.shellsort.input; +import team.shellsort.model.Car; + +import java.io.BufferedReader; +import java.io.FileReader; +import java.io.IOException; +import java.util.ArrayList; +import java.util.List; +import java.util.Random; + public class RandomDataProvider implements DataProvider { + private static final String[] models = {"Almera", "Focus", "Lancer", "Camry", "Corolla"}; + private static final int[] years = {2, 2002, 203, 2004, 2005}; + private static final int[] power = {100, 200, 300, 400, 0}; + @Override - public LoadResult load(int limit) { + public LoadResult load() { // TODO: реализовать генерацию случайных данных - return null; + + + List listCars = new ArrayList(); + List invalidLines = new ArrayList<>(); + Car carBuilder; + + int a = 0, b = 0, c = 0, count = years.length; + while (count > 0) { + a = new Random().nextInt(5); + b = new Random().nextInt(5); + c = new Random().nextInt(5); + + carBuilder = new Car.CarBuilder() + .setModel(models[a]) + .setYear(years[b]) + .setPower(power[c]) + .build(); + + if (Validator.isValid(carBuilder)){ + listCars.add(carBuilder); + }else { + invalidLines.add(carBuilder.getModel() + ";" + carBuilder.getYear() + ";" + carBuilder.getPower()); + } + count--; + } + + return new LoadResult(listCars, invalidLines); } } From fa199e30fb4f1a0b6e9859dcb81200d1f7d628c4 Mon Sep 17 00:00:00 2001 From: davidbilalov Date: Fri, 7 Nov 2025 21:55:49 +0300 Subject: [PATCH 2/2] feature/davidbilalov/input --- src/main/java/team/shellsort/strategy/ByModel.java | 2 +- src/main/java/team/shellsort/strategy/ByPower.java | 2 +- src/main/java/team/shellsort/strategy/ByYear.java | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/main/java/team/shellsort/strategy/ByModel.java b/src/main/java/team/shellsort/strategy/ByModel.java index 8048c84..fe35851 100644 --- a/src/main/java/team/shellsort/strategy/ByModel.java +++ b/src/main/java/team/shellsort/strategy/ByModel.java @@ -3,7 +3,7 @@ import team.shellsort.model.Car; import java.util.Comparator; -public class ByModel implements SortStrategy { +public abstract class ByModel implements SortStrategy { public Comparator comparator() { return Comparator.comparing(Car::getModel); } public String name() { return "По модели"; } } diff --git a/src/main/java/team/shellsort/strategy/ByPower.java b/src/main/java/team/shellsort/strategy/ByPower.java index 5fdc74e..c1780ad 100644 --- a/src/main/java/team/shellsort/strategy/ByPower.java +++ b/src/main/java/team/shellsort/strategy/ByPower.java @@ -3,7 +3,7 @@ import team.shellsort.model.Car; import java.util.Comparator; -public class ByPower implements SortStrategy { +public abstract class ByPower implements SortStrategy { public Comparator comparator() { return Comparator.comparingInt(Car::getPower); } public String name() { return "По мощности"; } } diff --git a/src/main/java/team/shellsort/strategy/ByYear.java b/src/main/java/team/shellsort/strategy/ByYear.java index 6697b73..a57912a 100644 --- a/src/main/java/team/shellsort/strategy/ByYear.java +++ b/src/main/java/team/shellsort/strategy/ByYear.java @@ -3,7 +3,7 @@ import team.shellsort.model.Car; import java.util.Comparator; -public class ByYear implements SortStrategy { +public abstract class ByYear implements SortStrategy { public Comparator comparator() { return Comparator.comparingInt(Car::getYear); } public String name() { return "По году"; } }