Vanilla_Fury

laba_5_1_java

Apr 12th, 2021 (edited)
332
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Java 14.42 KB | None | 0 0
  1. package com.company;
  2.  
  3. import java.io.*;
  4. import java.nio.file.Files;
  5. import java.nio.file.Paths;
  6. import java.util.ArrayList;
  7. import java.util.Scanner;
  8. import java.util.regex.Matcher;
  9. import java.util.regex.Pattern;
  10.  
  11. public class Main {
  12.  
  13.     private static final String REG_EX_PATH_TO_TXT_FILE = ".+\\.txt|^$";
  14.     private static final String REG_EX_FOR_LINE_OF_NUMBERS = "^\\s*(0*[1-9]\\d{0,2}\\b\\s*)+$";
  15.     private static final String REG_EX_FOR_NUMBER = "[1-9]\\d{0,2}";
  16.     private static final String ASK_PATH_TO_FILE = "Введите путь к файлу. (Нажмите Enter для отмены ввода)";
  17.     private static final String CLARIFICATION_ASK_PATH_TO_FILE = "Введите абсолютный путь к текстовому файлу (.txt).";
  18.  
  19.     private static Scanner scConsole;
  20.  
  21.     private static final MyList myList = new MyList();
  22.     private static final MyList arrList = new MyList();
  23.     private static int[] arr;
  24.     private static String inputList;
  25.     private static String inputArr;
  26.  
  27.     private static short choose(String sQuestion, String[] Options) { // не больше 9-ти вариантов ответа
  28.         short nChoice;
  29.         String answer;
  30.         StringBuilder optionsDigits = new StringBuilder();
  31.  
  32.         System.out.println(sQuestion + "\n\tВарианты: ");
  33.         for (int i = 0; i < Options.length; i++) {
  34.             System.out.println("\t" + (i + 1) + " - " + Options[i]);
  35.             optionsDigits.append(i + 1);
  36.         }
  37.  
  38.         answer = getAnythingFromConsole("", "^[" + optionsDigits + "]$", "Нужно ввести " +
  39.                 "цифру (одну из предложенных).");
  40.         nChoice = (short) (Short.parseShort(answer) - 1);
  41.  
  42.         return nChoice;
  43.     }
  44.  
  45.     private static String getAnythingFromConsole(String Question, String regEx, String clarification) {
  46.         String sInput;
  47.         String sOutput;
  48.         final String stringIfNothingIsFoundInString = "";
  49.         boolean nothingIsFoundIsNotAllowed = findRegEx(regEx, "\\^\\$", "")[0].equals("");
  50.  
  51.         if (!Question.equals("")) {
  52.             System.out.println(Question);
  53.         }
  54.  
  55.         do {
  56.             sInput = scConsole.nextLine().trim();
  57.             sOutput = findRegEx(sInput, regEx, stringIfNothingIsFoundInString)[0];
  58.             if (sOutput.equals(stringIfNothingIsFoundInString) && nothingIsFoundIsNotAllowed) {
  59.                 System.err.println("Данные введены неверно. " + clarification + "\nПовторите попытку:");
  60.             }
  61.         } while (sOutput.equals(stringIfNothingIsFoundInString) && nothingIsFoundIsNotAllowed);
  62.  
  63.         System.out.println();
  64.         return sOutput;
  65.     }
  66.  
  67.     private static String[] findRegEx(String sInput, String regEx, String outputIfNothingFound) {
  68.         ArrayList<String> arrStringOutput = new ArrayList<>();
  69.         Pattern pattern = Pattern.compile(regEx);
  70.         Matcher matcher = pattern.matcher(sInput);
  71.  
  72.         if (matcher.find()) {
  73.             do {
  74.                 arrStringOutput.add(matcher.group());
  75.             } while (matcher.find());
  76.         } else
  77.             arrStringOutput.add(outputIfNothingFound);
  78.  
  79.         return arrStringOutput.toArray(new String[0]);
  80.     }
  81.  
  82.     private static void createNewList() {
  83.         myList.clear();
  84.         arrList.clear();
  85.  
  86.         String inputStr = getAnythingFromConsole("Введите список (числа через пробел).", REG_EX_FOR_LINE_OF_NUMBERS, "Надо ввести числа (от 1 до 999) через пробел.");
  87.         String[] inputs = findRegEx(inputStr, REG_EX_FOR_NUMBER, "");
  88.         for (String oneStr : inputs) {
  89.             myList.addNode(Integer.parseInt(oneStr));
  90.         }
  91.         inputList = inputStr;
  92.  
  93.         inputStr = getAnythingFromConsole("Введите массив (числа через пробел).", REG_EX_FOR_LINE_OF_NUMBERS, "Надо ввести числа (от 1 до 999) через пробел.");
  94.         inputs = findRegEx(inputStr, REG_EX_FOR_NUMBER, "");
  95.         for (String input : inputs) {
  96.             arrList.addNode(Integer.parseInt(input));
  97.         }
  98.         inputArr = inputStr;
  99.     }
  100.  
  101.     private static boolean exportDataFromFile() {
  102.         final String MES_INPUT_DONE = "Данные успешно импортированы.\n";
  103.         final String ERROR_COULD_NOT_OPEN_OR_READ_FILE = "Ошибка. Не удалось открыть или прочитать " +
  104.                 "текстовый файл в заданной Вами директории.";
  105.  
  106.         boolean isNotCorrect = true;
  107.         boolean processIsNotAborted = true;
  108.  
  109.         myList.clear();
  110.         arrList.clear();
  111.  
  112.         do {
  113.             String sPathToFile = getAnythingFromConsole(ASK_PATH_TO_FILE, REG_EX_PATH_TO_TXT_FILE,
  114.                     CLARIFICATION_ASK_PATH_TO_FILE);
  115.  
  116.             if (sPathToFile.equals("")) {
  117.                 processIsNotAborted = false;
  118.             } else {
  119.                 try (BufferedReader bufferedReader = new BufferedReader(new FileReader(new File(sPathToFile)))) {
  120.                     String temp;
  121.                     boolean isCorrect = true;
  122.  
  123.                     temp = bufferedReader.readLine();
  124.                     if (temp == null || findRegEx(temp, REG_EX_FOR_LINE_OF_NUMBERS, "")[0].equals("")) {
  125.                         System.out.println("Ошибка. Как минимум одна строка в файле записана неверно. " +
  126.                                 "Не удалось импортировать данные.");
  127.                         isCorrect = false;
  128.                     } else {
  129.                         String[] inputs = findRegEx(temp, REG_EX_FOR_NUMBER, "");
  130.                         for (String oneStr : inputs) {
  131.                             myList.addNode(Integer.parseInt(oneStr));
  132.                         }
  133.                     }
  134.                     inputList = temp;
  135.  
  136.                     if (isCorrect) {
  137.                         temp = bufferedReader.readLine();
  138.                         if (temp == null || findRegEx(temp, REG_EX_FOR_LINE_OF_NUMBERS, "")[0].equals("")) {
  139.                             System.out.println("Ошибка. Как минимум одна строка в файле записана неверно. " +
  140.                                     "Не удалось импортировать данные.");
  141.                             isCorrect = false;
  142.                         } else {
  143.                             String[] inputs = findRegEx(temp, REG_EX_FOR_NUMBER, "");
  144.                             for (String oneStr : inputs) {
  145.                                 arrList.addNode(Integer.parseInt(oneStr));
  146.                             }
  147.                         }
  148.                         inputArr = temp;
  149.                     }
  150.  
  151.                     if (isCorrect) {
  152.                         isNotCorrect = false;
  153.                         System.out.println(MES_INPUT_DONE);
  154.                     }
  155.                 } catch (java.io.IOException e) {
  156.                     System.out.println(ERROR_COULD_NOT_OPEN_OR_READ_FILE);
  157.                 }
  158.             }
  159.         } while (isNotCorrect && processIsNotAborted);
  160.         return processIsNotAborted;
  161.     }
  162.  
  163.     private static void saveToFile() {
  164.         final String MES_OUTPUT_DONE = "Данные успешно записаны в файл.\n";
  165.         final String ERROR_COULD_NOT_OPEN_OR_CREATE_OR_WRITE_FILE = "Ошибка. Не удалось создать, открыть или записать " +
  166.                 "текстовый файл в заданной Вами директории.";
  167.         String sPathToFile;
  168.         boolean isNotCorrect = true;
  169.         boolean processIsNotAborted = true;
  170.         do {
  171.             sPathToFile = getAnythingFromConsole(ASK_PATH_TO_FILE, REG_EX_PATH_TO_TXT_FILE,
  172.                     CLARIFICATION_ASK_PATH_TO_FILE);
  173.             if (sPathToFile.equals("")) {
  174.                 processIsNotAborted = false;
  175.             } else {
  176.                 if (Files.exists(Paths.get(sPathToFile)) && choose("Файл \"" + sPathToFile +
  177.                         "\" уже существует.\n" + "Вы уверены, что хотите перезаписать файл? Все текущие данные в этом " +
  178.                         "файле будут безвозвратно утеряны.", new String[]{"да, перезаписать файл.",
  179.                         "нет, выбрать другой файл."}) == 0) {
  180.                     try (BufferedWriter bufferedWriter = new BufferedWriter(new FileWriter(new File(sPathToFile)))) {
  181.                         bufferedWriter.append("Входной список: \n").append(inputList).append("\nВходной массив:\n")
  182.                                 .append(inputArr).append("\nОтвет:\n");
  183.  
  184.                         for (int i = 0; i < arr.length - 1; i++) {
  185.                             bufferedWriter.append(Integer.toString(myList.findByPos(arr[i] - 1))).append(" ");
  186.                         }
  187.                         bufferedWriter.append(Integer.toString(myList.findByPos(arr[arr.length - 1] - 1))).append("\n");
  188.  
  189.                         isNotCorrect = false;
  190.                         System.out.println(MES_OUTPUT_DONE);
  191.                     } catch (java.io.IOException e) {
  192.                         System.out.println(ERROR_COULD_NOT_OPEN_OR_CREATE_OR_WRITE_FILE);
  193.                     }
  194.                 }
  195.             }
  196.         } while (isNotCorrect && processIsNotAborted);
  197.     }
  198.  
  199.     private static void outputAnswer() {
  200.         arr = new int[arrList.count];
  201.  
  202.         boolean numbersInArrAreOk = arrList.count == myList.count;
  203.         if (numbersInArrAreOk) {
  204.             for (int i = 0; i < arrList.count; i++) {
  205.                 arr[i] = arrList.findByPos(i);
  206.             }
  207.  
  208.             int i = 0;
  209.  
  210.             while (i < arr.length && numbersInArrAreOk) {
  211.                 numbersInArrAreOk = arr[i] > 0 && arr[i] <= arr.length;
  212.                 i++;
  213.             }
  214.         }
  215.  
  216.         if (numbersInArrAreOk) {
  217.             System.out.println("Ответ: ");
  218.             for (int i = 0; i < arr.length - 1; i++) {
  219.                 System.out.print(myList.findByPos(arr[i] - 1) + ", ");
  220.             }
  221.             System.out.println(myList.findByPos(arr[arr.length - 1] - 1) + "\n");
  222.  
  223.             short answerOnQuestion = choose("Хотите вывести ответ в файл?",
  224.                     new String[]{"да", "нет"});
  225.             if (answerOnQuestion == 0) {
  226.                 saveToFile();
  227.             }
  228.         } else {
  229.             System.out.println("Ошибка. Числа в массиве не соответствуют порядковым номерам элементов в списке.\n");
  230.         }
  231.     }
  232.  
  233.     private static void showHelp() {
  234.         short answerOnQuestion;
  235.         do {
  236.             answerOnQuestion = choose("Справка", new String[]{"о программе", "задание", "автор", "назад"});
  237.             switch (answerOnQuestion) {
  238.                 case 0 -> System.out.println("О программе:\n" +
  239.                         "\tВы можете вводить список и массив вручную.\n" +
  240.                         "\tВы также можете импортировать данные из файла и экспортировать ответ в файл.\n");
  241.                 case 1 -> System.out.println("Задание:\n\tДан неупорядоченный линейный односвязный список и " +
  242.                         "массив, содержащий номера соответствующих элементов в упорядоченном списке.\n\tПерестроить " +
  243.                         "данный список в соответствии с номерами, заданными массивом.\n");
  244.                 case 2 -> System.out.println("Автор:\n\tПанев Александр, гр. 051007\n\tМинск, 2021\n");
  245.             }
  246.         } while (answerOnQuestion != 3);
  247.     }
  248.  
  249.     private static void mainMenu() {
  250.         short answerOnQuestion;
  251.         do {
  252.             answerOnQuestion = choose("Главное меню",
  253.                     new String[]{"ввести список и массив", "открыть имеющийся список из файла", "показать справку", "закрыть программу"});
  254.             switch (answerOnQuestion) {
  255.                 case 0 -> {
  256.                     createNewList();
  257.                     outputAnswer();
  258.                 }
  259.                 case 1 -> {
  260.                     if (exportDataFromFile()) {
  261.                         outputAnswer();
  262.                     }
  263.                 }
  264.                 case 2 -> showHelp();
  265.             }
  266.         } while (answerOnQuestion != 3);
  267.     }
  268.  
  269.     public static void main(String[] args) {
  270.         scConsole = new Scanner(System.in);
  271.  
  272.         // /Users/sasha/Documents/___Университет/ОАиП/Пз/Лабы/блок 5/input.txt
  273.  
  274.         mainMenu();
  275.         System.out.println("До свидания");
  276.  
  277.         scConsole.close();
  278.     }
  279. }
  280.  
  281.  
  282.  
  283.  
  284.  
  285.  
  286.  
  287.  
  288.  
  289.  
  290.  
  291.  
  292.  
  293. package com.company;
  294.  
  295. public class MyList {
  296.     private MyNode headNode;
  297.     public int count;
  298.  
  299.     public MyList() {
  300.         headNode = null;
  301.         count = 0;
  302.     }
  303.  
  304.     public void addNode(int data) {
  305.         boolean sameNotFound = true;
  306.         if (headNode == null) {
  307.             headNode = new MyNode(data);
  308.             count++;
  309.         } else {
  310.             MyNode currentNode = headNode;
  311.             while (currentNode.nextNode != null && sameNotFound) {
  312.                 currentNode = currentNode.nextNode;
  313.                 sameNotFound = currentNode.data != data;
  314.             }
  315.             if (sameNotFound) {
  316.                 currentNode.nextNode = new MyNode(data);
  317.                 count++;
  318.             }
  319.         }
  320.     }
  321.  
  322.     public void clear() {
  323.         headNode = null;
  324.     }
  325.  
  326.     public int findByPos(int pos) {
  327.         MyNode current = headNode;
  328.         int i = 0;
  329.         while (i != pos) {
  330.             current = current.nextNode;
  331.             i++;
  332.         }
  333.         return current.data;
  334.     }
  335. }
  336.  
  337.  
  338.  
  339.  
  340.  
  341.  
  342.  
  343.  
  344.  
  345.  
  346.  
  347.  
  348. package com.company;
  349.  
  350. public class MyNode {
  351.     int data;
  352.     MyNode nextNode;
  353.  
  354.     public MyNode(int data) {
  355.         this.data = data;
  356.     }
  357. }
  358.  
Advertisement
Add Comment
Please, Sign In to add comment