From a50bdcf5f7df5a1aec39093f18e0cb0489c1d91c Mon Sep 17 00:00:00 2001 From: fedor tvorogov Date: Fri, 14 Feb 2025 08:13:40 +0300 Subject: [PATCH] FIXBUG --- src/main/java/AuthorOfBook.java | 5 ++ src/main/java/BinarySearch.java | 2 - src/main/java/Book.java | 7 +- src/main/java/BookRandomizer.java | 32 ++++----- src/main/java/Car.java | 7 +- src/main/java/CarRandomizer.java | 32 ++++----- src/main/java/CheckHelp.java | 4 +- src/main/java/ColourOfRV.java | 5 ++ src/main/java/DataType.java | 18 ++++++ src/main/java/ExitAction.java | 5 +- src/main/java/Main.java | 29 +++------ src/main/java/ManuallyFillArrayAction.java | 63 +++++++++++++++++- src/main/java/Menu.java | 46 +------------ src/main/java/MenuAction.java | 2 +- src/main/java/PagesOfBook.java | 5 ++ src/main/java/ParseBook.java | 31 +++------ src/main/java/ParseCar.java | 34 +++------- src/main/java/ParseRootVegetable.java | 31 +++------ src/main/java/ParserHelper.java | 29 +++++++++ src/main/java/PowerOfCar.java | 5 ++ src/main/java/PrintArrayAction.java | 24 +++---- src/main/java/PrintType.java | 13 ++++ src/main/java/RandomFillArrayAction.java | 61 +++++++----------- src/main/java/ReadFileArrayAction.java | 40 ++++++++++++ src/main/java/RootVegetable.java | 9 ++- src/main/java/RootVegetableRandomizer.java | 32 ++++----- src/main/java/SearchAction.java | 62 ++++++++++++++++++ src/main/java/SearchHelper.java | 75 ++++++++++++++++++++++ src/main/java/Sort.java | 3 - src/main/java/SortAction.java | 70 ++++++++++++++++++++ src/main/java/Storage.java | 9 ++- src/main/java/TitleOfBook.java | 5 ++ src/main/java/TypeOfRV.java | 5 ++ src/main/java/WeightOfRV.java | 5 ++ src/main/java/WriterFile.java | 5 +- 35 files changed, 548 insertions(+), 262 deletions(-) create mode 100644 src/main/java/AuthorOfBook.java create mode 100644 src/main/java/ColourOfRV.java create mode 100644 src/main/java/DataType.java create mode 100644 src/main/java/PagesOfBook.java create mode 100644 src/main/java/ParserHelper.java create mode 100644 src/main/java/PowerOfCar.java create mode 100644 src/main/java/PrintType.java create mode 100644 src/main/java/ReadFileArrayAction.java create mode 100644 src/main/java/SearchAction.java create mode 100644 src/main/java/SearchHelper.java create mode 100644 src/main/java/SortAction.java create mode 100644 src/main/java/TitleOfBook.java create mode 100644 src/main/java/TypeOfRV.java create mode 100644 src/main/java/WeightOfRV.java diff --git a/src/main/java/AuthorOfBook.java b/src/main/java/AuthorOfBook.java new file mode 100644 index 0000000..01601de --- /dev/null +++ b/src/main/java/AuthorOfBook.java @@ -0,0 +1,5 @@ +class AuthorOfBook extends ValueGetter{ + public java.lang.String get(Book book){ + return book.getAuthor(); + } +} \ No newline at end of file diff --git a/src/main/java/BinarySearch.java b/src/main/java/BinarySearch.java index f01a529..e4cbcc6 100644 --- a/src/main/java/BinarySearch.java +++ b/src/main/java/BinarySearch.java @@ -1,6 +1,4 @@ import java.util.Optional; -import java.util.Comparator; -import java.util.List; import java.lang.String; import java.util.LinkedList; import java.util.Collection; diff --git a/src/main/java/Book.java b/src/main/java/Book.java index 8cc3b4c..e8da1f5 100644 --- a/src/main/java/Book.java +++ b/src/main/java/Book.java @@ -1,7 +1,7 @@ public class Book { private String author; private String title; - private Integer pages; + private static Integer pages; public Book() { } @@ -20,7 +20,10 @@ public String getTitle() { return title; } - public int getPages() { + public Integer getPages() { + return pages; + } + public static Integer getPages(Object o) { return pages; } diff --git a/src/main/java/BookRandomizer.java b/src/main/java/BookRandomizer.java index f1a6503..7e5bd82 100644 --- a/src/main/java/BookRandomizer.java +++ b/src/main/java/BookRandomizer.java @@ -1,11 +1,11 @@ import java.util.Random; public class BookRandomizer implements ItemRandomizer { - private static final String[] AUTHORS = {"Jane Austen", "Harper Lee", "Scott Fitzgerald", "Gabriel Garcia", "Truman Capote"}; - private static final String[] TITLES = {"Pride and Prejudice", "To Kill a Mockingbird", "The Great Gatsby", "One Hundred Years of Solitude", "In Cold Blood"}; - private static final Integer MIN_PAGES = 300; - private static final Integer MAX_PAGES = 1500; - private static final Random RANDOM = new Random(); + private final String[] authors = {"Jane Austen", "Harper Lee", "Scott Fitzgerald", "Gabriel Garcia", "Truman Capote"}; + private final String[] titles = {"Pride and Prejudice", "To Kill a Mockingbird", "The Great Gatsby", "One Hundred Years of Solitude", "In Cold Blood"}; + private final Integer minPages = 300; + private final Integer maxPages = 1500; + private final Random random = new Random(); @Override public Book generate(){ @@ -13,24 +13,20 @@ public Book generate(){ String title = getRandomTitle(); Integer pages = getRandomPages(); - return new Book.Builder() - .setAuthor(author) - .setTitle(title) - .setPages(pages) - .build(); + return Book.createInstance(author,title,pages); } - private static String getRandomAuthor() { - int index = RANDOM.nextInt(AUTHORS.length); - return AUTHORS[index]; + private String getRandomAuthor() { + int index = random.nextInt(authors.length); + return authors[index]; } - private static String getRandomTitle() { - int index = RANDOM.nextInt(TITLES.length); - return TITLES[index]; + private String getRandomTitle() { + int index = random.nextInt(titles.length); + return titles[index]; } - private static Integer getRandomPages() { - return MIN_PAGES + RANDOM.nextInt(MAX_PAGES - MIN_PAGES + 1); + private Integer getRandomPages() { + return minPages + random.nextInt(maxPages - minPages + 1); } } diff --git a/src/main/java/Car.java b/src/main/java/Car.java index 383d499..d75f44a 100644 --- a/src/main/java/Car.java +++ b/src/main/java/Car.java @@ -1,14 +1,18 @@ public class Car { - private Integer power; + private static Integer power; private String model; private Integer yearOfProduction; public Car() { } + public Integer getPower() { return power; } + public static Integer getPower(Object o) { + return power; + } public String getModel() { return model; @@ -28,6 +32,7 @@ public String toString() { '}'; } + public static class BuildCAr{ private Integer power; private String model; diff --git a/src/main/java/CarRandomizer.java b/src/main/java/CarRandomizer.java index 37b83b6..7b71e88 100644 --- a/src/main/java/CarRandomizer.java +++ b/src/main/java/CarRandomizer.java @@ -1,12 +1,12 @@ import java.util.Random; public class CarRandomizer implements ItemRandomizer{ - private static final String[] MODELS = {"Ford Bronco", "Haval Jolion", "Audi A3", "Mercedes-Benz V-Class", "Lexus LS"}; - private static final Integer MIN_POWER = 100; - private static final Integer MAX_POWER = 400; - private static final Integer MIN_YEAR = 2000; - private static final Integer MAX_YEAR = 2025; - private static final Random RANDOM = new Random(); + private final String[] models = {"Ford Bronco", "Haval Jolion", "Audi A3", "Mercedes-Benz V-Class", "Lexus LS"}; + private final Integer minPower = 100; + private final Integer maxPower = 400; + private final Integer minYear = 2000; + private final Integer maxYear = 2025; + private final Random random = new Random(); @Override public Car generate() { @@ -14,23 +14,19 @@ public Car generate() { String model = getRandomModel(); Integer year = getRandomYear(); - return new Car.BuildCAr() - .setPower(power) - .setModel(model) - .setYearOfProduction(year) - .build(); + return Car.createInstance(power,model,year); } - private static Integer getRandomPower() { - return MIN_POWER + RANDOM.nextInt(MAX_POWER - MIN_POWER + 1); + private Integer getRandomPower() { + return minPower + random.nextInt(maxPower - minPower + 1); } - private static String getRandomModel() { - int index = RANDOM.nextInt(MODELS.length); - return MODELS[index]; + private String getRandomModel() { + int index = random.nextInt(models.length); + return models[index]; } - private static Integer getRandomYear() { - return MIN_YEAR + RANDOM.nextInt(MAX_YEAR - MIN_YEAR + 1); + private Integer getRandomYear() { + return minYear + random.nextInt(maxYear - minYear + 1); } } diff --git a/src/main/java/CheckHelp.java b/src/main/java/CheckHelp.java index a69ea4d..bc8f2ee 100644 --- a/src/main/java/CheckHelp.java +++ b/src/main/java/CheckHelp.java @@ -4,10 +4,10 @@ public static Boolean carCheck(Integer power, String model, Integer year) { } public static Boolean bookCheck(String author, String title, Integer pages) { - return pages != null && !author.isEmpty() && !title.isEmpty() & pages > 0; + return pages != null && !author.isEmpty() && !title.isEmpty() && pages > 0; } public static Boolean rootVegetableCheck(String type, String colour, Integer weight) { - return weight != null && !type.isEmpty() && !colour.isEmpty() & weight > 0; + return weight != null && !type.isEmpty() && !colour.isEmpty() && weight > 0; } } diff --git a/src/main/java/ColourOfRV.java b/src/main/java/ColourOfRV.java new file mode 100644 index 0000000..ae7d046 --- /dev/null +++ b/src/main/java/ColourOfRV.java @@ -0,0 +1,5 @@ +class ColourOfRV extends ValueGetter{ + public java.lang.String get(RootVegetable rv){ + return rv.getColour(); + } +} \ No newline at end of file diff --git a/src/main/java/DataType.java b/src/main/java/DataType.java new file mode 100644 index 0000000..25a211a --- /dev/null +++ b/src/main/java/DataType.java @@ -0,0 +1,18 @@ +public class DataType { + public static enum datatype{ + CAR(Car.class), + BOOK(Book.class), + ROOTVEGETABLE(RootVegetable.class); + private final Class clazz; + + datatype(Class clazz) { + this.clazz = clazz; + } + public Class getClazz() { + return clazz; + } + public String getClassName() { + return clazz.getSimpleName(); + } + } +} diff --git a/src/main/java/ExitAction.java b/src/main/java/ExitAction.java index 8cc71a4..d0d0342 100644 --- a/src/main/java/ExitAction.java +++ b/src/main/java/ExitAction.java @@ -1,8 +1,9 @@ public class ExitAction implements MenuAction{ @Override - public void execute() { + public MenuAction execute() { System.out.println("Выход из программы..."); System.exit(0); - } + return null; + } } \ No newline at end of file diff --git a/src/main/java/Main.java b/src/main/java/Main.java index 011125c..06a0ee9 100644 --- a/src/main/java/Main.java +++ b/src/main/java/Main.java @@ -1,30 +1,19 @@ -import java.util.Arrays; -import java.util.Scanner; + public class Main { - public static enum datatype{ - CAR, - BOOK, - ROOTVEGETABLE - } public static void main(String[] args) { - //Storage storage = Storage.getInstance(); - Menu print_array_menu=new Menu(); - print_array_menu.prelude="Выберите тип данных"; - print_array_menu.addAction("1", "Автомобиль",new PrintArrayAction(datatype.CAR)); - print_array_menu.addAction("2", "Книга",new PrintArrayAction(datatype.BOOK)); - print_array_menu.addAction("3", "Корнепллод",new PrintArrayAction(datatype.ROOTVEGETABLE)); - print_array_menu.addAction("0", "Отмена", null); - Menu menu = new Menu(); menu.reopen_after_submenu_closes=true; - menu.addAction("1", "Заполнение массива объектов вручную", new ManuallyFillArrayAction()); - menu.addAction("2", "Создание массива объектов с рандомными значениями", new RandomFillArrayAction()); - menu.addAction("3", "Вывод массива объектов на экран", print_array_menu); - menu.addAction("4", "Сортировка массива", null);//TODO - menu.addAction("5", "Выход", null); + menu.addAction("1", "Заполнение массива объектов из файла", new ReadFileArrayAction()); + menu.addAction("2", "Заполнение массива объектов вручную", new ManuallyFillArrayAction()); + menu.addAction("3", "Заполнение массива объектов рандомными значениями", new RandomFillArrayAction()); + menu.addAction("4", "Вывод массива объектов на экран", new PrintType()); + menu.addAction("5", "Сортировка", new SortAction()); + menu.addAction("7", "Поиск элемента в массиве",new SearchHelper()); + menu.addAction("0", "Выход", new ExitAction()); menu.execute(); + } } diff --git a/src/main/java/ManuallyFillArrayAction.java b/src/main/java/ManuallyFillArrayAction.java index 3c9d2bf..e5a29d2 100644 --- a/src/main/java/ManuallyFillArrayAction.java +++ b/src/main/java/ManuallyFillArrayAction.java @@ -1,6 +1,65 @@ -public class ManuallyFillArrayAction implements MenuAction{ +import java.io.File; +import java.util.Scanner; + +public class ManuallyFillArrayAction implements MenuAction { + @Override - public void execute(){ + public MenuAction execute() { + Scanner scanner = new Scanner(System.in); + boolean step = true; + while (step) { + System.out.println("Выберите тип данных для массива:"); + System.out.println("1. Автомобиль"); + System.out.println("2. Книга"); + System.out.println("3. Корнепллод"); + System.out.println("0. Вернуться в главное меню"); + String choice = scanner.next(); + switch (choice) { + case "1": + fillArray(scanner, DataType.datatype.CAR, new FillCarManually()); + step = false; + break; + case "2": + fillArray(scanner, DataType.datatype.BOOK, new FillBookManually()); + step = false; + break; + case "3": + fillArray(scanner, DataType.datatype.ROOTVEGETABLE, new FillRootVegetableManually()); + step = false; + break; + case "0": + step = false; + break; + } + } + return null; + } + + private void fillArray(Scanner scanner, DataType.datatype datatype, Fill filler) { + Storage storage = Storage.getInstance(datatype); + T[] array = filler.fill(); + int start_index = findFirst(storage, array.length); + Object[] objects = storage.getObjects(); + System.arraycopy(array, 0, objects, start_index, array.length); + String className = datatype.getClassName(); + WriterFile writerFile = new WriterFile<>(new File(className + ".txt")); + writerFile.createdFile(); + writerFile.writeText(objects); + } + + private int findFirst(Storage storage, int size) { + Object[] objects = storage.getObjects(); + int startIndex = 0; + // Найти первое свободное место в массиве + while (startIndex < objects.length && objects[startIndex] != null) { + startIndex++; + } + // Если места нет увеличиваем размер массива + if (startIndex >= objects.length) { + storage.expandArray(size); + objects = storage.getObjects(); + } + return startIndex; } } diff --git a/src/main/java/Menu.java b/src/main/java/Menu.java index 1520705..d38a790 100644 --- a/src/main/java/Menu.java +++ b/src/main/java/Menu.java @@ -1,5 +1,4 @@ import java.util.HashMap; -import java.util.Map; import java.util.Scanner; public class Menu implements MenuAction{ @@ -26,31 +25,8 @@ public Menu() { public void addAction(String key, String name, MenuAction action){ choices.put(key, new Pair(name, action)); } - - /* - public void display() { - while (true) { - System.out.println("Выберите действие:"); - System.out.println("1. Заполнение массива объектов вручную"); - System.out.println("2. Создание массива объектов с рандомными значениями"); - System.out.println("3. Вывод массива объектов на экран"); - System.out.println("4. Сортировка массива"); - System.out.println("0. Выход"); - - int choice = getIntInput(); - MenuAction action = actions.get(choice); - if (action != null) { - action.execute(); - } else if (choice == 0) { - actions.get(0).execute(); - } else { - System.out.println("Неверный выбор. Попробуйте снова."); - } - System.out.println(); - } - }*/ - public void execute(){ + public MenuAction execute(){ String input; do{ for (String k : choices.keySet()){ @@ -68,26 +44,10 @@ public void execute(){ System.out.println(wrong); } if (next.b==null){ - return; + return null; } next.b.execute(); }while(reopen_after_submenu_closes); + return null; } - /* - private int getIntInput() { - Scanner scanner = new Scanner(System.in); - int number; - while (true) { - System.out.print("Введите целое число: "); - if (scanner.hasNextInt()) { - number = scanner.nextInt(); - break; - } else { - System.out.println("Ошибка: Введено не целое число. Попробуйте снова."); - scanner.next(); // Очистить некорректный ввод - } - } - return number; - - }*/ } \ No newline at end of file diff --git a/src/main/java/MenuAction.java b/src/main/java/MenuAction.java index ae001d7..0127750 100644 --- a/src/main/java/MenuAction.java +++ b/src/main/java/MenuAction.java @@ -1,3 +1,3 @@ public interface MenuAction { - void execute(); + MenuAction execute(); } diff --git a/src/main/java/PagesOfBook.java b/src/main/java/PagesOfBook.java new file mode 100644 index 0000000..7020473 --- /dev/null +++ b/src/main/java/PagesOfBook.java @@ -0,0 +1,5 @@ +class PagesOfBook extends ValueGetter{ + public java.lang.Integer get(Book book){ + return book.getPages(); + } +} \ No newline at end of file diff --git a/src/main/java/ParseBook.java b/src/main/java/ParseBook.java index 28fd24e..8625bc2 100644 --- a/src/main/java/ParseBook.java +++ b/src/main/java/ParseBook.java @@ -1,27 +1,14 @@ +import java.util.Map; + public class ParseBook { - public Book parse(String line) { - String[] parts = line.substring(line.indexOf("{") + 1, line.indexOf("}")).split(","); - String author = null; - String title = null; - Integer pages = null; + private final ParserHelper parserHelper = new ParserHelper(); - for (String part : parts) { - String[] keyValue = part.split("="); - String key = keyValue[0].trim(); - String value = keyValue[1].trim().replaceAll("'", ""); + public Book parse(String line) { + Map keyValueMap = parserHelper.parseKeyValuePairs(line); + String author = keyValueMap.get("author"); + String title = keyValueMap.get("title"); + Integer pages = parserHelper.parseInteger(keyValueMap.get("pages")); - if (key.contains("author")) { - author = value; - } else if (key.contains("title")) { - title = value; - } else if (key.contains("pages")) { - try { - pages = Integer.parseInt(value); - } catch (NumberFormatException e) { - throw new RuntimeException(e); - } - } - } - return new Book.Builder().setAuthor(author).setTitle(title).setPages(pages).build(); + return Book.createInstance(author,title,pages); } } diff --git a/src/main/java/ParseCar.java b/src/main/java/ParseCar.java index 8dc4cb5..7098f5c 100644 --- a/src/main/java/ParseCar.java +++ b/src/main/java/ParseCar.java @@ -1,30 +1,14 @@ +import java.util.Map; + public class ParseCar { - public Car parse(String line) { - String[] parts = line.substring(line.indexOf("{") + 1, line.indexOf("}")).split(","); - Integer power = null; - String model = null; - Integer year = null; + private final ParserHelper parserHelper = new ParserHelper(); - for (String part : parts) { - String[] keyValue = part.split("="); - String key = keyValue[0].trim(); - String value = keyValue[1].trim().replaceAll("'", ""); + public Car parse(String line) { + Map keyValueMap = parserHelper.parseKeyValuePairs(line); + Integer power = parserHelper.parseInteger(keyValueMap.get("power")); + String model = keyValueMap.get("model"); + Integer year = parserHelper.parseInteger(keyValueMap.get("yearOfProduction")); - if (key.contains("power")) { - try { - power = Integer.parseInt(value); - } catch (NumberFormatException e) { - } - } else if (key.contains("model")) { - model = value; - } else if (key.contains("yearOfProduction")) { - try { - year = Integer.parseInt(value); - } catch (NumberFormatException e) { - throw new RuntimeException(e); - } - } - } - return new Car.BuildCAr().setPower(power).setModel(model).setYearOfProduction(year).build(); + return Car.createInstance(power,model,year); } } diff --git a/src/main/java/ParseRootVegetable.java b/src/main/java/ParseRootVegetable.java index c14a96e..2976367 100644 --- a/src/main/java/ParseRootVegetable.java +++ b/src/main/java/ParseRootVegetable.java @@ -1,27 +1,14 @@ +import java.util.Map; + public class ParseRootVegetable { - public RootVegetable parse(String line) { - String[] parts = line.substring(line.indexOf("{") + 1, line.indexOf("}")).split(","); - String type = null; - String colour = null; - Integer weight = null; + private final ParserHelper parserHelper = new ParserHelper(); - for (String part : parts) { - String[] keyValue = part.split("="); - String key = keyValue[0].trim(); - String value = keyValue[1].trim().replaceAll("'", ""); + public RootVegetable parse(String line) { + Map keyValueMap = parserHelper.parseKeyValuePairs(line); + String type = keyValueMap.get("type"); + String colour = keyValueMap.get("colour"); + Integer weight = parserHelper.parseInteger(keyValueMap.get("weight")); - if (key.contains("type")) { - type = value; - } else if (key.contains("colour")) { - colour = value; - } else if (key.contains("weight")) { - try { - weight = Integer.parseInt(value); - } catch (NumberFormatException e) { - throw new RuntimeException(e); - } - } - } - return new RootVegetable.Builder().setType(type).setColour(colour).setWeight(weight).build(); + return RootVegetable.createInstance(type, colour, weight); } } diff --git a/src/main/java/ParserHelper.java b/src/main/java/ParserHelper.java new file mode 100644 index 0000000..a52acc8 --- /dev/null +++ b/src/main/java/ParserHelper.java @@ -0,0 +1,29 @@ +import java.util.HashMap; +import java.util.Map; + +class ParserHelper { + + public Map parseKeyValuePairs(String line) { + String content = line.substring(line.indexOf("{") + 1, line.indexOf("}")); + Map keyValueMap = new HashMap<>(); + for (String part : content.split(",")) { + String[] keyValue = part.split("="); + if (keyValue.length != 2) { + continue; + } + String key = keyValue[0].trim(); + String value = keyValue[1].trim().replaceAll("'", ""); + keyValueMap.put(key, value); + } + return keyValueMap; + } + + public Integer parseInteger(String value) { + try { + return Integer.parseInt(value); + } catch (NumberFormatException e) { + System.out.println("Ошибка ввода: " + e); + } + return null; + } +} diff --git a/src/main/java/PowerOfCar.java b/src/main/java/PowerOfCar.java new file mode 100644 index 0000000..35c2ce3 --- /dev/null +++ b/src/main/java/PowerOfCar.java @@ -0,0 +1,5 @@ +class PowerOfCar extends ValueGetter{ + public java.lang.Integer get(Car car){ + return car.getPower(); + } +} \ No newline at end of file diff --git a/src/main/java/PrintArrayAction.java b/src/main/java/PrintArrayAction.java index ee69b06..9b4864e 100644 --- a/src/main/java/PrintArrayAction.java +++ b/src/main/java/PrintArrayAction.java @@ -1,23 +1,23 @@ public class PrintArrayAction implements MenuAction { - Main.datatype selector; + DataType.datatype selector; - PrintArrayAction(Main.datatype i){ + PrintArrayAction(DataType.datatype i){ selector=i; } @Override - public void execute(){ + public MenuAction execute(){ Storage storage = Storage.getInstance(selector); - if (storage==null){ + if (storage.getObjects().length != 0){ + T[] objects = storage.getObjects(); + + System.out.println("Элементы массива:"); + for (T value : objects) { + System.out.println(value + " "); + } System.out.println("Нет объектов данного типа."); - return; } - T[] objects = storage.getObjects(); - System.out.println("Элементы массива:"); - for (T value : objects) { - System.out.println(value + " "); - } - //System.out.println(); - } + return null; + } } diff --git a/src/main/java/PrintType.java b/src/main/java/PrintType.java new file mode 100644 index 0000000..02e6ef3 --- /dev/null +++ b/src/main/java/PrintType.java @@ -0,0 +1,13 @@ +public class PrintType implements MenuAction { + + @Override + public MenuAction execute() { + Menu print_array_menu=new Menu(); + print_array_menu.prelude="Выберите тип данных"; + print_array_menu.addAction("1", "Автомобиль",new PrintArrayAction(DataType.datatype.CAR)); + print_array_menu.addAction("2", "Книга",new PrintArrayAction(DataType.datatype.BOOK)); + print_array_menu.addAction("3", "Корнепллод",new PrintArrayAction(DataType.datatype.ROOTVEGETABLE)); + print_array_menu.addAction("0", "Отмена", null); + return print_array_menu; + } +} diff --git a/src/main/java/RandomFillArrayAction.java b/src/main/java/RandomFillArrayAction.java index 21696c3..0e148dc 100644 --- a/src/main/java/RandomFillArrayAction.java +++ b/src/main/java/RandomFillArrayAction.java @@ -1,14 +1,13 @@ +import java.io.File; import java.util.Scanner; public class RandomFillArrayAction implements MenuAction { @Override - public void execute(){ - //Storage storage = Storage.getInstance(); - //Object[] objects = storage.getObjects(); + public MenuAction execute(){ Scanner scanner = new Scanner(System.in); boolean step = true; - + System.out.print("Введите размер массива: "); int size = getIntInput(scanner); @@ -23,55 +22,41 @@ public void execute(){ String choice = scanner.next(); switch (choice) { case "1": - do{ - Storage storage= Storage.getInstance(Main.datatype.CAR); - int start_index=findFirst(storage,size); - Object[] objects = storage.getObjects(); - ItemRandomizer carRandomizer = new CarRandomizer(); - - - for (int i = start_index; i < objects.length; i++) { - objects[i] = carRandomizer.generate(); - } + System.out.println("Выбраны Автомобили"); + fillArray(scanner,size,DataType.datatype.CAR,new CarRandomizer()); step = false; - }while(false); break; case "2": - System.out.println("Выбран Книга"); - do{ - //Book - Storage storage= Storage.getInstance(Main.datatype.BOOK); - int start_index=findFirst(storage,size); - Object[] objects = storage.getObjects(); - ItemRandomizer bookRandomizer = new BookRandomizer(); - - for (int i = start_index; i < objects.length; i++) { - objects[i] = bookRandomizer.generate(); - } + System.out.println("Выбраны Книги"); + fillArray(scanner,size,DataType.datatype.BOOK,new BookRandomizer()); step = false; - }while(false); break; case "3": System.out.println("Выбран Корнепллод"); - do{ - Storage storage= Storage.getInstance(Main.datatype.ROOTVEGETABLE); - int start_index=findFirst(storage,size); - Object[] objects = storage.getObjects(); - - ItemRandomizer rootVegetableRandomizer = new RootVegetableRandomizer(); - - for (int i = start_index; i < objects.length; i++) { - objects[i] = rootVegetableRandomizer.generate(); - } + fillArray(scanner,size,DataType.datatype.ROOTVEGETABLE,new RootVegetableRandomizer()); step = false; - }while(false); break; case "0": step = false; break; } } + System.out.println("выход"); + return null; + } + + private void fillArray(Scanner scanner, int size, DataType.datatype datatype, ItemRandomizer randomizer) { + Storage storage = Storage.getInstance(datatype); + int start_index = findFirst(storage, size); + Object[] objects = storage.getObjects(); + for (int i = start_index; i < objects.length; i++) { + objects[i] = randomizer.generate(); + } + String className = datatype.getClassName(); + WriterFile writerFile = new WriterFile<>(new File(className + ".txt")); + writerFile.createdFile(); + writerFile.writeText(objects); } private int findFirst(Storagestorage, int size){ diff --git a/src/main/java/ReadFileArrayAction.java b/src/main/java/ReadFileArrayAction.java new file mode 100644 index 0000000..5d7b3c6 --- /dev/null +++ b/src/main/java/ReadFileArrayAction.java @@ -0,0 +1,40 @@ + +import java.io.IOException; +import java.util.Arrays; +import java.util.Scanner; + +public class ReadFileArrayAction implements MenuAction{ + + + @Override + public MenuAction execute() { + Scanner scanner = new Scanner(System.in); + System.out.println("Введите путь"); + String path = scanner.next(); + String pathchek = path.substring(0, path.length() - 4); + Class type; + var reader = new ReaderFile(); + + try { + if (pathchek.equals("Car")) { + Storage storage= Storage.getInstance(DataType.datatype.CAR); + type = Car.class; + } else if (pathchek.equals("Book")) { + Storage storage= Storage.getInstance(DataType.datatype.BOOK); + type = Book.class; + } else if (pathchek.equals("RootVegetable")) { + Storage storage= Storage.getInstance(DataType.datatype.ROOTVEGETABLE); + type = RootVegetable.class; + } else { + System.out.println("Неподдерживаемый тип файла."); + return null; + } + Object[] resultRead = reader.readAndConvert(path,type); + Arrays.stream(resultRead).forEach(System.out::println); + } catch (IOException e) { + System.out.println("Ошибка компиляции: " + e);; + } + return null; + } +} + diff --git a/src/main/java/RootVegetable.java b/src/main/java/RootVegetable.java index 64ec9ed..67fb147 100644 --- a/src/main/java/RootVegetable.java +++ b/src/main/java/RootVegetable.java @@ -1,7 +1,7 @@ public class RootVegetable { private String type; private String colour; - private Integer weight; + private static Integer weight; public RootVegetable() { } @@ -20,7 +20,10 @@ public String getColour() { return colour; } - public Integer getWeight() { + public static Integer getWeight() { + return weight; + } + public static Integer getWeight(Object o) { return weight; } @@ -33,6 +36,8 @@ public String toString() { '}'; } + + public static class Builder{ private String type; private String colour; diff --git a/src/main/java/RootVegetableRandomizer.java b/src/main/java/RootVegetableRandomizer.java index 13066c3..4f083bf 100644 --- a/src/main/java/RootVegetableRandomizer.java +++ b/src/main/java/RootVegetableRandomizer.java @@ -1,11 +1,11 @@ import java.util.Random; public class RootVegetableRandomizer implements ItemRandomizer { - private static final String[] TYPES = {"potato", "onion", "daikon", "parsnip",}; - private static final String[] COLOURS = {"yellow", "red", "purple", "white",}; - private static final Integer MIN_WEIGHT = 50; - private static final Integer MAX_WEIGHT = 300; - private static final Random RANDOM = new Random(); + private final String[] types = {"potato", "onion", "daikon", "parsnip",}; + private final String[] colours = {"yellow", "red", "purple", "white",}; + private final Integer minWeight = 50; + private final Integer maxWeight = 300; + private final Random random = new Random(); @Override public RootVegetable generate() { @@ -13,24 +13,20 @@ public RootVegetable generate() { String colour = getRandomColour(); Integer weight = getRandomWeight(); - return new RootVegetable.Builder() - .setType(type) - .setColour(colour) - .setWeight(weight) - .build(); + return RootVegetable.createInstance(type,colour,weight); } - private static String getRandomType() { - int index = RANDOM.nextInt(TYPES.length); - return TYPES[index]; + private String getRandomType() { + int index = random.nextInt(types.length); + return types[index]; } - private static String getRandomColour() { - int index = RANDOM.nextInt(COLOURS.length); - return COLOURS[index]; + private String getRandomColour() { + int index = random.nextInt(colours.length); + return colours[index]; } - private static Integer getRandomWeight() { - return MIN_WEIGHT + RANDOM.nextInt(MAX_WEIGHT - MIN_WEIGHT + 1); + private Integer getRandomWeight() { + return minWeight + random.nextInt(maxWeight - minWeight + 1); } } diff --git a/src/main/java/SearchAction.java b/src/main/java/SearchAction.java new file mode 100644 index 0000000..6d66223 --- /dev/null +++ b/src/main/java/SearchAction.java @@ -0,0 +1,62 @@ +import java.util.Scanner; +import java.util.function.Function; +import java.lang.String; +import java.lang.Exception; +import java.util.Optional; + +class SearchAction implements MenuAction{ + //Обрабатывает запрос поиска и выводит результат + private static Scanner scan= new Scanner(System.in); + public DataType.datatype class_selector; + public ValueGetter getter; + CustomComparator comp; + public Function parser; + + public SearchAction setGetter(ValueGetter getter){ + this.getter=getter; + return this; + } + + public SearchAction setComp(CustomComparator comp){ + this.comp=comp; + return this; + } + + public SearchAction setParser(Function parser){ + this.parser=parser; + return this; + } + + public SearchAction setSelector(DataType.datatype i){ + class_selector=i; + return this; + } + + public MenuAction execute(){ + BinarySearch search=new BinarySearch(); + Optional result; + Storage storage= Storage.getInstance(class_selector); + search=search. new BinarySearchBuilder(). + addObjects(storage.getObjects()). + setGetter(getter). + setComparator(comp).build(); + while(true){ + System.out.print("Запрос:"); + String input=scan.nextLine(); + V search_value; + try{ + search_value=parser.apply(input); + }catch(Exception e){ + System.out.println(e.toString()); + continue; + } + result = search.findObject(search_value); + if(result.isPresent()){ + break; + } + System.out.println("Не найдено"); + } + System.out.println(result.get().toString()); + return null; + } +} \ No newline at end of file diff --git a/src/main/java/SearchHelper.java b/src/main/java/SearchHelper.java new file mode 100644 index 0000000..eca10c7 --- /dev/null +++ b/src/main/java/SearchHelper.java @@ -0,0 +1,75 @@ +import java.util.function.Function; + +public class SearchHelper extends SearchAction implements MenuAction { + @Override + public MenuAction execute() { + Menu search_menu = new Menu(); + CustomComparator IntComp = (Integer a, Integer b) -> (b - a); + CustomComparator StrComp = String::compareTo; + Function Str2Int = Integer::parseInt; + Function Str2Str = (String str) -> str; + search_menu.prelude = "Выберите тип данных"; + + Menu carMenu = new Menu(); + carMenu.addAction("1", "По году", new SearchHelper() + .setGetter(new CowLevel.YearOfCar()) + .setComp(IntComp) + .setParser(Str2Int) + .setSelector(DataType.datatype.CAR)); + carMenu.addAction("2", "По мощности", new SearchHelper() + .setGetter(new PowerOfCar()) + .setComp(IntComp) + .setParser(Str2Int) + .setSelector(DataType.datatype.CAR)); + carMenu.addAction("3", "По модели", new SearchHelper() + .setGetter(new CowLevel.YearOfCar()) + .setComp(StrComp) + .setParser(Str2Str) + .setSelector(DataType.datatype.CAR)); + carMenu.addAction("0", "Отмена", null); + search_menu.addAction("1", "Автомобиль", carMenu); + + + Menu bookMenu = new Menu(); + bookMenu.addAction("1", "По названию", new SearchHelper() + .setGetter(new TitleOfBook()) + .setComp(StrComp) + .setParser(Str2Str) + .setSelector(DataType.datatype.BOOK)); + bookMenu.addAction("2", "По автору", new SearchHelper() + .setGetter(new AuthorOfBook()) + .setComp(StrComp) + .setParser(Str2Str) + .setSelector(DataType.datatype.BOOK)); + bookMenu.addAction("3", "По страницам", new SearchHelper() + .setGetter(new PagesOfBook()) + .setComp(IntComp) + .setParser(Str2Int) + .setSelector(DataType.datatype.BOOK)); + bookMenu.addAction("0", "Отмена", null); + search_menu.addAction("2", "Книга", bookMenu); + + Menu rvMenu = new Menu(); + rvMenu.addAction("1", "По типу", new SearchHelper() + .setGetter(new TypeOfRV()) + .setComp(StrComp) + .setParser(Str2Str) + .setSelector(DataType.datatype.ROOTVEGETABLE)); + rvMenu.addAction("2", "По цвету", new SearchHelper() + .setGetter(new ColourOfRV()) + .setComp(StrComp) + .setParser(Str2Str) + .setSelector(DataType.datatype.ROOTVEGETABLE)); + rvMenu.addAction("3", "По весу", new SearchHelper() + .setGetter(new WeightOfRV()) + .setComp(IntComp) + .setParser(Str2Int) + .setSelector(DataType.datatype.ROOTVEGETABLE)); + rvMenu.addAction("0", "Отмена", null); + search_menu.addAction("3", "Корнепллод", rvMenu); + + + search_menu.addAction("0", "Отмена", null); + return null; + } +} \ No newline at end of file diff --git a/src/main/java/Sort.java b/src/main/java/Sort.java index 619ceac..cc8ed01 100644 --- a/src/main/java/Sort.java +++ b/src/main/java/Sort.java @@ -8,13 +8,10 @@ public Sort(CustomComparator comparator) { } private void merge(T[] src1, int src1Start, T[] src2, int src2Start, T[] dest, int destStart, int size) { - //Стартовые значения int index1 = src1Start; int index2 = src2Start; - //Конечная точка и обработка чтобы массивы не выходили за границу int src1End = Math.min(src1Start + size, src1.length); int src2End = Math.min(src2Start + size, src2.length); - //вычисление общего кол-ва элементов для слияния int iterationalCount = src1End - src1Start + src2End - src2Start; for (int i = destStart; i < destStart + iterationalCount; i++) { diff --git a/src/main/java/SortAction.java b/src/main/java/SortAction.java new file mode 100644 index 0000000..10930a6 --- /dev/null +++ b/src/main/java/SortAction.java @@ -0,0 +1,70 @@ +import java.io.File; +import java.util.Arrays; +import java.util.Scanner; +import java.util.function.Function; + +public class SortAction implements MenuAction { + + @Override + public MenuAction execute() { + Scanner scanner = new Scanner(System.in); + System.out.println("Введите путь файла:"); + String path = scanner.next(); + + DataType.datatype dataType; + Storage storage; + CustomComparator comparator; + Class type; + Function extractor; + if (path.toLowerCase().endsWith("car.txt")) { + dataType = DataType.datatype.CAR; + comparator = new CarComporator(); + type = Car.class; + extractor = Car::getPower; + storage = Storage.getInstance(dataType); + } else if (path.toLowerCase().endsWith("book.txt")) { + dataType = DataType.datatype.BOOK; + comparator = new BookComporator(); + type = Book.class; + extractor = Book::getPages; + storage = Storage.getInstance(dataType); + } else if (path.toLowerCase().endsWith("rootvegetable.txt")) { + dataType = DataType.datatype.ROOTVEGETABLE; + comparator = new RootVegetableComporator(); + type = RootVegetable.class; + extractor = RootVegetable::getWeight; + storage = Storage.getInstance(dataType); + } else { + System.out.println("неккоректный тип данных"); + return null; + } + + if (storage == null || storage.getObjects().length == 0) { + System.out.println("ошибка массива"); + return null; + } + System.out.println("Выберите способ сортировки:\n " + + "1 Сортировка слиянием.\n" + + "2 Сортировка по четным числам"); + String choise = scanner.next(); + switch (choise) { + case "1": + Sort sort1 = new Sort<>(comparator); + Object[] mergesort = sort1.mergeSort(storage.getObjects()); + WriterFile writerFile1 = new WriterFile<>(new File("Mergesort" + type + ".txt")); + writerFile1.createdFile(); + writerFile1.writeText(mergesort); + Arrays.stream(mergesort).forEach(System.out::println); + break; + case "2": + SortEvenOdd sort2 = new SortEvenOdd<>(comparator); + Object[] sortevenodd = sort2.sortEvenOdd(storage.getObjects(),extractor); + WriterFile writerFile2 = new WriterFile<>(new File("Evenodd" + type + ".txt")); + writerFile2.createdFile(); + writerFile2.writeText(sortevenodd); + Arrays.stream(sortevenodd).forEach(System.out::println); + break; + } + return null; + } +} diff --git a/src/main/java/Storage.java b/src/main/java/Storage.java index 2b32e73..b650893 100644 --- a/src/main/java/Storage.java +++ b/src/main/java/Storage.java @@ -2,16 +2,14 @@ import java.lang.reflect.Array; import java.lang.Class; public class Storage { - private static HashMap instances =new HashMap();//содержит Pair с - //private static Storage instances; + private static HashMap instances =new HashMap();//содержит Pair с private Object[] objects; public Storage() { this.objects = new Object[] {}; } - public static Storage getInstance(Main.datatype i){ - //Class cl= new T().getClass();//mega ugly hack, but java is really stupid + public static Storage getInstance(DataType.datatype i){ Storage instance=instances.get(i); if (instance == null) { instance = new Storage(); @@ -21,7 +19,7 @@ public static Storage getInstance(Main.datatype i){ } public void expandArray(int addSize) { - Object[] newArray = new Object[objects.length + addSize];///*(T[])*/ Array.newInstance(new Class(),objects.length + addSize);//new T[objects.length + addSize]; + Object[] newArray = new Object[objects.length + addSize]; System.arraycopy(objects, 0, newArray, 0, objects.length); objects = newArray; } @@ -29,4 +27,5 @@ public void expandArray(int addSize) { public T[] getObjects() { return (T[]) objects; } + } diff --git a/src/main/java/TitleOfBook.java b/src/main/java/TitleOfBook.java new file mode 100644 index 0000000..1b6a7ea --- /dev/null +++ b/src/main/java/TitleOfBook.java @@ -0,0 +1,5 @@ +class TitleOfBook extends ValueGetter{ + public java.lang.String get(Book book){ + return book.getTitle(); + } +} \ No newline at end of file diff --git a/src/main/java/TypeOfRV.java b/src/main/java/TypeOfRV.java new file mode 100644 index 0000000..00c2033 --- /dev/null +++ b/src/main/java/TypeOfRV.java @@ -0,0 +1,5 @@ +class TypeOfRV extends ValueGetter{ + public java.lang.String get(RootVegetable rv){ + return rv.getType(); + } +} \ No newline at end of file diff --git a/src/main/java/WeightOfRV.java b/src/main/java/WeightOfRV.java new file mode 100644 index 0000000..a20b87b --- /dev/null +++ b/src/main/java/WeightOfRV.java @@ -0,0 +1,5 @@ +class WeightOfRV extends ValueGetter{ + public java.lang.Integer get(RootVegetable rv){ + return rv.getWeight(); + } +} \ No newline at end of file diff --git a/src/main/java/WriterFile.java b/src/main/java/WriterFile.java index aac1749..3f762d3 100644 --- a/src/main/java/WriterFile.java +++ b/src/main/java/WriterFile.java @@ -15,10 +15,7 @@ public File getName() { public void createdFile() { try { - if(this.name.createNewFile()) { - } else { - System.out.println(this.name.getName() + "уже имеется"); - } + this.name.createNewFile(); } catch (IOException e) { System.out.println(this.name + "ошибка создания" + e); }