Vanilla_Fury

laba_5_2_java

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