Skip to content

Commit 2789209

Browse files
committed
cleanup: keep only DataProvider, FileDataProvider, RandomDataProvider
1 parent ff0f3ea commit 2789209

File tree

9 files changed

+159
-106
lines changed

9 files changed

+159
-106
lines changed

CarList

Lines changed: 0 additions & 3 deletions
This file was deleted.

build.gradle

Lines changed: 0 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -23,10 +23,3 @@ dependencies {
2323
test {
2424
useJUnitPlatform()
2525
}
26-
compileJava.options.encoding = 'UTF-8' // устанавливает кодировку для компилируемого кода
27-
javadoc.options.encoding = 'UTF-8' // устанавливает кодировку для генерируемой документации
28-
compileTestJava.options.encoding = 'UTF-8'
29-
30-
tasks.withType(JavaCompile) {
31-
options.encoding = 'UTF-8'
32-
}

src/main/java/team/shellsort/App.java

Lines changed: 50 additions & 53 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,5 @@
11
package team.shellsort;
22

3-
import team.shellsort.input.ConsoleDataProvider;
4-
import team.shellsort.input.FileDataProvider;
5-
import team.shellsort.input.RandomDataProvider;
63
import team.shellsort.model.Car;
74
import team.shellsort.strategy.ByModel;
85
import team.shellsort.strategy.ByPower;
@@ -49,7 +46,7 @@ public class App {
4946
*/
5047
public static void main(String[] args) {
5148
System.out.println("=== ShellSort App (черновик интеграции) ===");
52-
// runMenuLoop();
49+
runMenuLoop();
5350
System.out.println("Завершено. До встречи!");
5451
}
5552

@@ -59,41 +56,41 @@ public static void main(String[] args) {
5956
*
6057
* <p>Цикл продолжается, пока пользователь не выберет пункт «Выход».
6158
*/
62-
// private static void runMenuLoop() {
63-
// while (true) {
64-
// int source = askSource();
65-
// if (source == 0) {
66-
// break;
67-
// }
68-
//
69-
// int limit = askInt("Введите количество элементов (1..1000): ", 1, 1000);
70-
// SortStrategy strategy = askStrategy();
71-
//
72-
// // ===== Загрузка данных =====
73-
// // TODO (Давид + Артём): заменить mock на реальные провайдеры после интеграции Validator’а
74-
// // Пример будущего кода:
75-
// // DataProvider dp = switch (source) {
76-
// // case 1 -> new ConsoleDataProvider(SC, new LineParser());
77-
// // case 2 -> new FileDataProvider(/* path или запрос пути */);
78-
// // case 3 -> new RandomDataProvider(/* seed? */);
79-
// // case 4 -> new MockDataProviderAdapter(); // если захотим оставить mock
80-
// // default -> throw new IllegalStateException("Неожиданный источник: " + source);
81-
// // };
82-
// // LoadResult lr = dp.load(); // либо dp.load(limit), если финальная сигнатура с лимитом
83-
// // List<Car> cars = lr.validCars(); // имя метода — как договоримся
84-
// List<Car> cars = loadMockData(limit);
85-
//
86-
// // ===== Сортировка =====
87-
// cars.sort(strategy.comparator());
88-
//
89-
// // ===== Вывод =====
90-
// printCars(cars);
91-
//
92-
// if (!askYesNo("Ещё раз? (y/n): ")) {
93-
// break;
94-
// }
95-
// }
96-
// }
59+
private static void runMenuLoop() {
60+
while (true) {
61+
int source = askSource();
62+
if (source == 0) {
63+
break;
64+
}
65+
66+
int limit = askInt("Введите количество элементов (1..1000): ", 1, 1000);
67+
SortStrategy strategy = askStrategy();
68+
69+
// ===== Загрузка данных =====
70+
// TODO (Давид + Артём): заменить mock на реальные провайдеры после интеграции Validator’а
71+
// Пример будущего кода:
72+
// DataProvider dp = switch (source) {
73+
// case 1 -> new ConsoleDataProvider(SC, new LineParser());
74+
// case 2 -> new FileDataProvider(/* path или запрос пути */);
75+
// case 3 -> new RandomDataProvider(/* seed? */);
76+
// case 4 -> new MockDataProviderAdapter(); // если захотим оставить mock
77+
// default -> throw new IllegalStateException("Неожиданный источник: " + source);
78+
// };
79+
// LoadResult lr = dp.load(); // либо dp.load(limit), если финальная сигнатура с лимитом
80+
// List<Car> cars = lr.validCars(); // имя метода — как договоримся
81+
List<Car> cars = loadMockData(limit);
82+
83+
// ===== Сортировка =====
84+
cars.sort(strategy.comparator());
85+
86+
// ===== Вывод =====
87+
printCars(cars);
88+
89+
if (!askYesNo("Ещё раз? (y/n): ")) {
90+
break;
91+
}
92+
}
93+
}
9794

9895
/**
9996
* Отображает меню выбора источника данных и возвращает выбранный пункт.
@@ -132,20 +129,20 @@ private static int askSource() {
132129
*
133130
* @return выбранная стратегия сортировки
134131
*/
135-
// private static SortStrategy askStrategy() {
136-
// System.out.println();
137-
// System.out.println("Выберите стратегию сортировки:");
138-
// System.out.println(" 1) По модели (ignore case, nulls last) -> год -> мощность");
139-
// System.out.println(" 2) По мощности -> модель (ignore case) -> год");
140-
// System.out.println(" 3) По году -> модель (ignore case) -> мощность");
141-
// int choice = askInt("Ваш выбор: ", 1, 3);
142-
// return switch (choice) {
143-
// case 1 -> new ByModel();
144-
// case 2 -> new ByPower();
145-
// case 3 -> new ByYear();
146-
// default -> throw new IllegalStateException("Неожиданный выбор: " + choice);
147-
// };
148-
// }
132+
private static SortStrategy askStrategy() {
133+
System.out.println();
134+
System.out.println("Выберите стратегию сортировки:");
135+
System.out.println(" 1) По модели (ignore case, nulls last) -> год -> мощность");
136+
System.out.println(" 2) По мощности -> модель (ignore case) -> год");
137+
System.out.println(" 3) По году -> модель (ignore case) -> мощность");
138+
int choice = askInt("Ваш выбор: ", 1, 3);
139+
return switch (choice) {
140+
case 1 -> new ByModel();
141+
case 2 -> new ByPower();
142+
case 3 -> new ByYear();
143+
default -> throw new IllegalStateException("Неожиданный выбор: " + choice);
144+
};
145+
}
149146

150147
/**
151148
* Создаёт и возвращает список тестовых объектов {@code Car}.
Lines changed: 42 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -1,39 +1,62 @@
11
package team.shellsort.input;
22

3-
import team.shellsort.model.Car;
4-
53
import java.io.IOException;
64
import java.util.ArrayList;
75
import java.util.List;
86
import java.util.Scanner;
97

108
public class ConsoleDataProvider implements DataProvider {
119

12-
@Override
13-
public LoadResult load() {
10+
private static final String STOP_COMMAND = "stop";
11+
private final Scanner scanner;
12+
public ConsoleDataProvider(Scanner scanner) {
13+
this.scanner = scanner;
14+
}
1415

15-
List<Car> listCars = new ArrayList<Car>();
16+
@Override
17+
public LoadResult load() throws IOException {
18+
List<Car> validCars = new ArrayList<>();
1619
List<String> invalidLines = new ArrayList<>();
20+
LineParser parser = new LineParser();
21+
22+
System.out.println("-----------------------------------------------------");
23+
System.out.println("ВВОД С КОНСОЛИ (Формат: Модель;Мощность;Год)");
24+
System.out.println("Укажите количество элементов (например, 5):");
25+
26+
int count;
27+
try {
28+
count = Integer.parseInt(scanner.nextLine().trim());
29+
} catch (NumberFormatException e) {
30+
System.err.println("Ошибка: Введено неверное число.");
31+
return new LoadResult(validCars, invalidLines);
32+
}
1733

18-
try (Scanner scanner = new Scanner(System.in)) {
19-
System.out.println("Для выхода введите \"stop\"");
20-
while (scanner.hasNextLine()) {
21-
System.out.println("Формат ввода \"model;power;year\"");
34+
System.out.printf("Ожидается %d строк. Для досрочного завершения введите '%s'.\n", count, STOP_COMMAND);
2235

23-
String line = scanner.nextLine();
36+
// 2. Построчный ввод
37+
for (int i = 0; i < count; i++) {
38+
System.out.printf("Введите строку %d/%d: ", i + 1, count);
2439

25-
if (line.isEmpty() || line.equals("stop")) {
26-
break;
27-
}
40+
// Проверка, есть ли еще ввод (на всякий случай)
41+
if (!scanner.hasNextLine()) {
42+
break;
43+
}
44+
String line = scanner.nextLine();
45+
46+
if (line == null || line.trim().equalsIgnoreCase(STOP_COMMAND)) {
47+
System.out.println("Ввод досрочно завершен командой 'stop'.");
48+
break;
49+
}
2850

29-
if (Validator.isValid(LineParser.parse(line))){
30-
listCars.add(LineParser.parse(line));
31-
}else {
32-
invalidLines.add(line);
33-
}
51+
Car car = parser.parse(line);
3452

53+
if (car != null) {
54+
validCars.add(car);
55+
} else {
56+
invalidLines.add(line);
3557
}
3658
}
37-
return new LoadResult(listCars, invalidLines);
59+
60+
return new LoadResult(validCars, invalidLines);
3861
}
3962
}
Lines changed: 21 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -1,29 +1,34 @@
11
package team.shellsort.input;
22

3-
import team.shellsort.model.Car;
4-
53
public class LineParser {
64

75
private static final String SEPARATOR = ";";
86

9-
public static Car parse(String line) {
10-
// TODO: реализовать парсинг строки вида "model;power;year"
7+
public Car parse(String line) {
8+
if (line == null || line.trim().isEmpty()) {
9+
return null;
10+
}
1111

12-
String[] tokens = line.split(SEPARATOR);
12+
String[] parts = line.split(SEPARATOR);
13+
if (parts.length != 3) {
14+
return null;
15+
}
1316

14-
String model;
15-
int year;
16-
int power;
17+
try {
18+
String model = parts[0].trim();
19+
int power = Integer.parseInt(parts[1].trim());
20+
int year = Integer.parseInt(parts[2].trim());
1721

18-
try{
19-
model = tokens[0];
20-
year = Integer.parseInt(tokens[1]);
21-
power = Integer.parseInt(tokens[2]);
22-
} catch(Exception e){
23-
return new Car.CarBuilder().setModel("").setYear(0).setPower(0).build();
24-
}
22+
Car car = new Car(model, power, year);
2523

26-
return new Car.CarBuilder().setModel(model).setYear(year).setPower(power).build();
24+
if (Validator.isValid(car)) {
25+
return car;
26+
} else {
27+
return null;
28+
}
2729

30+
} catch (NumberFormatException e) {
31+
return null;
32+
}
2833
}
2934
}

src/main/java/team/shellsort/input/LoadResult.java

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,5 @@
11
package team.shellsort.input;
22

3-
import team.shellsort.model.Car;
4-
53
import java.util.Collections;
64
import java.util.List;
75

src/main/java/team/shellsort/strategy/ByModel.java

Lines changed: 16 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,21 @@
33
import team.shellsort.model.Car;
44
import java.util.Comparator;
55

6-
public abstract class ByModel implements SortStrategy {
7-
public Comparator<Car> comparator() { return Comparator.comparing(Car::getModel); }
6+
import static team.shellsort.strategy.StrategyUtils.NULL_LAST;
7+
8+
public final class ByModel implements SortStrategy {
9+
@Override
10+
public Comparator<Car> comparator() {
11+
return Comparator.comparing(Car::getModel, NULL_LAST)
12+
.thenComparingInt(Car::getYear)
13+
.thenComparingInt(Car::getPower);
14+
15+
}
16+
@Override
817
public String name() { return "По модели"; }
18+
19+
@Override
20+
public SortKey key() {
21+
return SortKey.BY_MODEL;
22+
}
923
}

src/main/java/team/shellsort/strategy/ByPower.java

Lines changed: 15 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,20 @@
33
import team.shellsort.model.Car;
44
import java.util.Comparator;
55

6-
public abstract class ByPower implements SortStrategy {
7-
public Comparator<Car> comparator() { return Comparator.comparingInt(Car::getPower); }
6+
import static team.shellsort.strategy.StrategyUtils.NULL_LAST;
7+
8+
public final class ByPower implements SortStrategy {
9+
@Override
10+
public Comparator<Car> comparator() {
11+
return Comparator.comparingInt(Car::getPower)
12+
.thenComparing(Car::getModel, NULL_LAST)
13+
.thenComparingInt(Car::getYear);
14+
}
15+
@Override
816
public String name() { return "По мощности"; }
17+
18+
@Override
19+
public SortKey key() {
20+
return SortKey.BY_POWER;
21+
}
922
}

src/main/java/team/shellsort/strategy/ByYear.java

Lines changed: 15 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,20 @@
33
import team.shellsort.model.Car;
44
import java.util.Comparator;
55

6-
public abstract class ByYear implements SortStrategy {
7-
public Comparator<Car> comparator() { return Comparator.comparingInt(Car::getYear); }
6+
import static team.shellsort.strategy.StrategyUtils.NULL_LAST;
7+
8+
public final class ByYear implements SortStrategy {
9+
@Override
10+
public Comparator<Car> comparator() {
11+
return Comparator.comparingInt(Car::getYear)
12+
.thenComparing(Car::getModel, NULL_LAST)
13+
.thenComparingInt(Car::getPower);
14+
}
15+
@Override
816
public String name() { return "По году"; }
17+
18+
@Override
19+
public SortKey key() {
20+
return SortKey.BY_YEAR;
21+
}
922
}

0 commit comments

Comments
 (0)