Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- package com.company;
- import java.io.*;
- import java.nio.file.Files;
- import java.nio.file.Paths;
- import java.util.ArrayList;
- import java.util.Scanner;
- import java.util.regex.Matcher;
- import java.util.regex.Pattern;
- public class Main {
- private static final String REG_EX_PATH_TO_TXT_FILE = ".+\\.txt|^$";
- private static final String REG_EX_FOR_LINE_OF_NUMBERS = "^\\s*(0*[1-9]\\d{0,2}\\b\\s*)+$";
- private static final String REG_EX_FOR_NUMBER = "[1-9]\\d{0,2}";
- private static final String ASK_PATH_TO_FILE = "Введите путь к файлу. (Нажмите Enter для отмены ввода)";
- private static final String CLARIFICATION_ASK_PATH_TO_FILE = "Введите абсолютный путь к текстовому файлу (.txt).";
- private static Scanner scConsole;
- private static final MyList myList = new MyList();
- private static final MyList arrList = new MyList();
- private static int[] arr;
- private static String inputList;
- private static String inputArr;
- private static short choose(String sQuestion, String[] Options) { // не больше 9-ти вариантов ответа
- short nChoice;
- String answer;
- StringBuilder optionsDigits = new StringBuilder();
- System.out.println(sQuestion + "\n\tВарианты: ");
- for (int i = 0; i < Options.length; i++) {
- System.out.println("\t" + (i + 1) + " - " + Options[i]);
- optionsDigits.append(i + 1);
- }
- answer = getAnythingFromConsole("", "^[" + optionsDigits + "]$", "Нужно ввести " +
- "цифру (одну из предложенных).");
- nChoice = (short) (Short.parseShort(answer) - 1);
- return nChoice;
- }
- private static String getAnythingFromConsole(String Question, String regEx, String clarification) {
- String sInput;
- String sOutput;
- final String stringIfNothingIsFoundInString = "";
- boolean nothingIsFoundIsNotAllowed = findRegEx(regEx, "\\^\\$", "")[0].equals("");
- if (!Question.equals("")) {
- System.out.println(Question);
- }
- do {
- sInput = scConsole.nextLine().trim();
- sOutput = findRegEx(sInput, regEx, stringIfNothingIsFoundInString)[0];
- if (sOutput.equals(stringIfNothingIsFoundInString) && nothingIsFoundIsNotAllowed) {
- System.err.println("Данные введены неверно. " + clarification + "\nПовторите попытку:");
- }
- } while (sOutput.equals(stringIfNothingIsFoundInString) && nothingIsFoundIsNotAllowed);
- System.out.println();
- return sOutput;
- }
- private static String[] findRegEx(String sInput, String regEx, String outputIfNothingFound) {
- ArrayList<String> arrStringOutput = new ArrayList<>();
- Pattern pattern = Pattern.compile(regEx);
- Matcher matcher = pattern.matcher(sInput);
- if (matcher.find()) {
- do {
- arrStringOutput.add(matcher.group());
- } while (matcher.find());
- } else
- arrStringOutput.add(outputIfNothingFound);
- return arrStringOutput.toArray(new String[0]);
- }
- private static void createNewList() {
- myList.clear();
- arrList.clear();
- String inputStr = getAnythingFromConsole("Введите список (числа через пробел).", REG_EX_FOR_LINE_OF_NUMBERS, "Надо ввести числа (от 1 до 999) через пробел.");
- String[] inputs = findRegEx(inputStr, REG_EX_FOR_NUMBER, "");
- for (String oneStr : inputs) {
- myList.addNode(Integer.parseInt(oneStr));
- }
- inputList = inputStr;
- inputStr = getAnythingFromConsole("Введите массив (числа через пробел).", REG_EX_FOR_LINE_OF_NUMBERS, "Надо ввести числа (от 1 до 999) через пробел.");
- inputs = findRegEx(inputStr, REG_EX_FOR_NUMBER, "");
- for (String input : inputs) {
- arrList.addNode(Integer.parseInt(input));
- }
- inputArr = inputStr;
- }
- private static boolean exportDataFromFile() {
- final String MES_INPUT_DONE = "Данные успешно импортированы.\n";
- final String ERROR_COULD_NOT_OPEN_OR_READ_FILE = "Ошибка. Не удалось открыть или прочитать " +
- "текстовый файл в заданной Вами директории.";
- boolean isNotCorrect = true;
- boolean processIsNotAborted = true;
- myList.clear();
- arrList.clear();
- do {
- String sPathToFile = getAnythingFromConsole(ASK_PATH_TO_FILE, REG_EX_PATH_TO_TXT_FILE,
- CLARIFICATION_ASK_PATH_TO_FILE);
- if (sPathToFile.equals("")) {
- processIsNotAborted = false;
- } else {
- try (BufferedReader bufferedReader = new BufferedReader(new FileReader(new File(sPathToFile)))) {
- String temp;
- boolean isCorrect = true;
- temp = bufferedReader.readLine();
- if (temp == null || findRegEx(temp, REG_EX_FOR_LINE_OF_NUMBERS, "")[0].equals("")) {
- System.out.println("Ошибка. Как минимум одна строка в файле записана неверно. " +
- "Не удалось импортировать данные.");
- isCorrect = false;
- } else {
- String[] inputs = findRegEx(temp, REG_EX_FOR_NUMBER, "");
- for (String oneStr : inputs) {
- myList.addNode(Integer.parseInt(oneStr));
- }
- }
- inputList = temp;
- if (isCorrect) {
- temp = bufferedReader.readLine();
- if (temp == null || findRegEx(temp, REG_EX_FOR_LINE_OF_NUMBERS, "")[0].equals("")) {
- System.out.println("Ошибка. Как минимум одна строка в файле записана неверно. " +
- "Не удалось импортировать данные.");
- isCorrect = false;
- } else {
- String[] inputs = findRegEx(temp, REG_EX_FOR_NUMBER, "");
- for (String oneStr : inputs) {
- arrList.addNode(Integer.parseInt(oneStr));
- }
- }
- inputArr = temp;
- }
- if (isCorrect) {
- isNotCorrect = false;
- System.out.println(MES_INPUT_DONE);
- }
- } catch (java.io.IOException e) {
- System.out.println(ERROR_COULD_NOT_OPEN_OR_READ_FILE);
- }
- }
- } while (isNotCorrect && processIsNotAborted);
- return processIsNotAborted;
- }
- private static void saveToFile() {
- final String MES_OUTPUT_DONE = "Данные успешно записаны в файл.\n";
- final String ERROR_COULD_NOT_OPEN_OR_CREATE_OR_WRITE_FILE = "Ошибка. Не удалось создать, открыть или записать " +
- "текстовый файл в заданной Вами директории.";
- String sPathToFile;
- boolean isNotCorrect = true;
- boolean processIsNotAborted = true;
- do {
- sPathToFile = getAnythingFromConsole(ASK_PATH_TO_FILE, REG_EX_PATH_TO_TXT_FILE,
- CLARIFICATION_ASK_PATH_TO_FILE);
- if (sPathToFile.equals("")) {
- processIsNotAborted = false;
- } else {
- if (Files.exists(Paths.get(sPathToFile)) && choose("Файл \"" + sPathToFile +
- "\" уже существует.\n" + "Вы уверены, что хотите перезаписать файл? Все текущие данные в этом " +
- "файле будут безвозвратно утеряны.", new String[]{"да, перезаписать файл.",
- "нет, выбрать другой файл."}) == 0) {
- try (BufferedWriter bufferedWriter = new BufferedWriter(new FileWriter(new File(sPathToFile)))) {
- bufferedWriter.append("Входной список: \n").append(inputList).append("\nВходной массив:\n")
- .append(inputArr).append("\nОтвет:\n");
- for (int i = 0; i < arr.length - 1; i++) {
- bufferedWriter.append(Integer.toString(myList.findByPos(arr[i] - 1))).append(" ");
- }
- bufferedWriter.append(Integer.toString(myList.findByPos(arr[arr.length - 1] - 1))).append("\n");
- isNotCorrect = false;
- System.out.println(MES_OUTPUT_DONE);
- } catch (java.io.IOException e) {
- System.out.println(ERROR_COULD_NOT_OPEN_OR_CREATE_OR_WRITE_FILE);
- }
- }
- }
- } while (isNotCorrect && processIsNotAborted);
- }
- private static void outputAnswer() {
- arr = new int[arrList.count];
- boolean numbersInArrAreOk = arrList.count == myList.count;
- if (numbersInArrAreOk) {
- for (int i = 0; i < arrList.count; i++) {
- arr[i] = arrList.findByPos(i);
- }
- int i = 0;
- while (i < arr.length && numbersInArrAreOk) {
- numbersInArrAreOk = arr[i] > 0 && arr[i] <= arr.length;
- i++;
- }
- }
- if (numbersInArrAreOk) {
- System.out.println("Ответ: ");
- for (int i = 0; i < arr.length - 1; i++) {
- System.out.print(myList.findByPos(arr[i] - 1) + ", ");
- }
- System.out.println(myList.findByPos(arr[arr.length - 1] - 1) + "\n");
- short answerOnQuestion = choose("Хотите вывести ответ в файл?",
- new String[]{"да", "нет"});
- if (answerOnQuestion == 0) {
- saveToFile();
- }
- } else {
- System.out.println("Ошибка. Числа в массиве не соответствуют порядковым номерам элементов в списке.\n");
- }
- }
- private static void showHelp() {
- short answerOnQuestion;
- do {
- answerOnQuestion = choose("Справка", new String[]{"о программе", "задание", "автор", "назад"});
- switch (answerOnQuestion) {
- case 0 -> System.out.println("О программе:\n" +
- "\tВы можете вводить список и массив вручную.\n" +
- "\tВы также можете импортировать данные из файла и экспортировать ответ в файл.\n");
- case 1 -> System.out.println("Задание:\n\tДан неупорядоченный линейный односвязный список и " +
- "массив, содержащий номера соответствующих элементов в упорядоченном списке.\n\tПерестроить " +
- "данный список в соответствии с номерами, заданными массивом.\n");
- case 2 -> System.out.println("Автор:\n\tПанев Александр, гр. 051007\n\tМинск, 2021\n");
- }
- } while (answerOnQuestion != 3);
- }
- private static void mainMenu() {
- short answerOnQuestion;
- do {
- answerOnQuestion = choose("Главное меню",
- new String[]{"ввести список и массив", "открыть имеющийся список из файла", "показать справку", "закрыть программу"});
- switch (answerOnQuestion) {
- case 0 -> {
- createNewList();
- outputAnswer();
- }
- case 1 -> {
- if (exportDataFromFile()) {
- outputAnswer();
- }
- }
- case 2 -> showHelp();
- }
- } while (answerOnQuestion != 3);
- }
- public static void main(String[] args) {
- scConsole = new Scanner(System.in);
- // /Users/sasha/Documents/___Университет/ОАиП/Пз/Лабы/блок 5/input.txt
- mainMenu();
- System.out.println("До свидания");
- scConsole.close();
- }
- }
- package com.company;
- public class MyList {
- private MyNode headNode;
- public int count;
- public MyList() {
- headNode = null;
- count = 0;
- }
- public void addNode(int data) {
- boolean sameNotFound = true;
- if (headNode == null) {
- headNode = new MyNode(data);
- count++;
- } else {
- MyNode currentNode = headNode;
- while (currentNode.nextNode != null && sameNotFound) {
- currentNode = currentNode.nextNode;
- sameNotFound = currentNode.data != data;
- }
- if (sameNotFound) {
- currentNode.nextNode = new MyNode(data);
- count++;
- }
- }
- }
- public void clear() {
- headNode = null;
- }
- public int findByPos(int pos) {
- MyNode current = headNode;
- int i = 0;
- while (i != pos) {
- current = current.nextNode;
- i++;
- }
- return current.data;
- }
- }
- package com.company;
- public class MyNode {
- int data;
- MyNode nextNode;
- public MyNode(int data) {
- this.data = data;
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment