Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 3 additions & 0 deletions CarList
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
Almera;2005;75
Focus;2009;110
Corolla;2014;90
7 changes: 7 additions & 0 deletions build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -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'
}
103 changes: 53 additions & 50 deletions src/main/java/team/shellsort/App.java
Original file line number Diff line number Diff line change
@@ -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;
Expand Down Expand Up @@ -46,7 +49,7 @@ public class App {
*/
public static void main(String[] args) {
System.out.println("=== ShellSort App (черновик интеграции) ===");
runMenuLoop();
// runMenuLoop();
System.out.println("Завершено. До встречи!");
}

Expand All @@ -56,41 +59,41 @@ public static void main(String[] args) {
*
* <p>Цикл продолжается, пока пользователь не выберет пункт «Выход».
*/
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<Car> cars = lr.validCars(); // имя метода — как договоримся
List<Car> 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<Car> cars = lr.validCars(); // имя метода — как договоримся
// List<Car> cars = loadMockData(limit);
//
// // ===== Сортировка =====
// cars.sort(strategy.comparator());
//
// // ===== Вывод =====
// printCars(cars);
//
// if (!askYesNo("Ещё раз? (y/n): ")) {
// break;
// }
// }
// }

/**
* Отображает меню выбора источника данных и возвращает выбранный пункт.
Expand Down Expand Up @@ -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}.
Expand Down
61 changes: 19 additions & 42 deletions src/main/java/team/shellsort/input/ConsoleDataProvider.java
Original file line number Diff line number Diff line change
@@ -1,62 +1,39 @@
package team.shellsort.input;

import team.shellsort.model.Car;

import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;

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<Car> validCars = new ArrayList<>();
List<String> 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<Car> listCars = new ArrayList<Car>();
List<String> 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);
}
}
7 changes: 7 additions & 0 deletions src/main/java/team/shellsort/input/DataProvider.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
package team.shellsort.input;

import java.io.IOException;

public interface DataProvider {
LoadResult load() throws IOException;
}
34 changes: 32 additions & 2 deletions src/main/java/team/shellsort/input/FileDataProvider.java
Original file line number Diff line number Diff line change
@@ -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<Car> listCars = new ArrayList<>();
List<String> 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);
}

}
37 changes: 16 additions & 21 deletions src/main/java/team/shellsort/input/LineParser.java
Original file line number Diff line number Diff line change
@@ -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;
}
}
}
2 changes: 2 additions & 0 deletions src/main/java/team/shellsort/input/LoadResult.java
Original file line number Diff line number Diff line change
@@ -1,5 +1,7 @@
package team.shellsort.input;

import team.shellsort.model.Car;

import java.util.Collections;
import java.util.List;

Expand Down
43 changes: 41 additions & 2 deletions src/main/java/team/shellsort/input/RandomDataProvider.java
Original file line number Diff line number Diff line change
@@ -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<Car> listCars = new ArrayList<Car>();
List<String> 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);
}
}
2 changes: 1 addition & 1 deletion src/main/java/team/shellsort/strategy/ByModel.java
Original file line number Diff line number Diff line change
Expand Up @@ -20,4 +20,4 @@ public Comparator<Car> comparator() {
public SortKey key() {
return SortKey.BY_MODEL;
}
}
}