Vanilla_Fury

laba_4_1_java

Feb 24th, 2021
282
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Java 33.23 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.*;
  7. import java.util.regex.Matcher;
  8. import java.util.regex.Pattern;
  9.  
  10. public class Main {
  11.  
  12.     private static Scanner scConsole;
  13.  
  14.     private static List<Student> students = new ArrayList();
  15.     private static List<Student> studentsCopy = new ArrayList();
  16.     private static String pathToLastFile = "";
  17.     private static boolean dataISSaved;
  18.     private static boolean nowFilteredGroup, nowFilteredAvScore;
  19.     private static short sortedBy;
  20.  
  21.     private static final String REG_EX_FOR_GROUP_NUMBER = "\\d{1,9}";
  22.     private static final String REG_EX_FOR_SURNAME = "[a-zA-Zа-яА-Я][-a-zA-Zа-яА-Я]{0,14}[a-zA-Zа-яА-Я]";
  23.     private static final String REG_EX_FOR_GRADE = "10|[1-9]|-";
  24.     private static final String REG_EX_FOR_GROUP_NUMBER_PLUS_SURNAME = "(" + REG_EX_FOR_GROUP_NUMBER + " *|)" + REG_EX_FOR_SURNAME;
  25.     private static final String REG_EX_FOR_ALL_GRADES = "((" + REG_EX_FOR_GRADE + ") *){0,3}(" + REG_EX_FOR_GRADE + ")?";
  26.     private static final String REG_EX_FOR_WHOLE_STUDENT = REG_EX_FOR_GROUP_NUMBER_PLUS_SURNAME + " *" + REG_EX_FOR_ALL_GRADES;
  27.     private static final String REG_EX_FOR_SEQUENCES = "^(\\d+( *, *| *- *\\d+ *, *))*\\d+(| *- *\\d+)$";
  28.     private static final String REG_EX_PATH_TO_TXT_FILE = ".+\\.txt|^$";
  29.  
  30.     private static final String MES_PRESS_ENTER_TO_STOP = "(Нажмите Enter для отмены ввода)";
  31.     private static final String ASK_PATH_TO_FILE = "Введите путь к файлу. " + MES_PRESS_ENTER_TO_STOP;
  32.     private static final String CLARIFICATION_ASK_PATH_TO_FILE = "Введите абсолютный путь к текстовому файлу (.txt).";
  33.     private static final String FORMAT_FOR_SPREADSHEET = "%-5s %-9s  %-16s  %-6s %-6s %-6s %-6s\n";
  34.  
  35.     private static final String HELP_INFO_STUDENT_INPUT = "Помощь по вводу информации о студенте:\n" +
  36.             "\tДля ввода информации о студенте введите номер группы студента, фамилию, " +
  37.             "оценки (математика, физика, программирование, инженерная графика).\n" +
  38.             "\tВводить данные рекомендуется через пробел, но для увеличения скорости ввода данные можно вводить " +
  39.             "и без пробелов.\n" +
  40.             "\tГруппу и оценки вводить необязательно. На месте неизвестной оценки, если после неё есть известные " +
  41.             "оценки, надо поставить знак \"-\".\n" +
  42.             "\tНапример: \n\t\t- \"051007 Панев 10 9 8 7\", если известна вся информация\n\t\t- \"Хотянович - - 9\", " +
  43.             "если известна только фомилия и оценка по программированию\n\t\t- \"Шаплов\", если известна только " +
  44.             "фамилия.\n";
  45.  
  46.     private static short choose(String sQuestion, String[] Options) { // не больше 9-ти вариантов ответа
  47.         short nChoice;
  48.         String answer;
  49.         StringBuilder optionsDigits = new StringBuilder();
  50.  
  51.         System.out.println(sQuestion + "\n\tВарианты: ");
  52.         for (int i = 0; i < Options.length; i++) {
  53.             System.out.println("\t" + (i + 1) + " - " + Options[i]);
  54.             optionsDigits.append(i + 1);
  55.         }
  56.  
  57.         answer = getAnythingFromConsole("", "^[" + optionsDigits + "]$", "Нужно ввести " +
  58.                 "цифру (одну из предложенных).");
  59.         nChoice = (short) (Short.parseShort(answer) - 1);
  60.  
  61.         return nChoice;
  62.     }
  63.  
  64.     private static String getAnythingFromConsole(String Question, String regEx, String clarification) {
  65.         String sInput;
  66.         String sOutput;
  67.         final String stringIfNothingIsFoundInString = findRegEx(regEx, "\\^\\$", "")[0].equals("") ?
  68.                 "" : "EmptyStringIsAllowed,SoThisStringShouldNotBeEmpty";
  69.  
  70.         if (!Question.equals("")) {
  71.             System.out.println(Question);
  72.         }
  73.  
  74.         do {
  75.             sInput = scConsole.nextLine().trim();
  76.             sOutput = findRegEx(sInput, regEx, stringIfNothingIsFoundInString)[0];
  77.             if (sOutput.equals(stringIfNothingIsFoundInString)) {
  78.                 System.err.println("Данные введены неверно. " + clarification + "\nПовторите попытку:");
  79.             }
  80.         } while (sOutput.equals(stringIfNothingIsFoundInString));
  81.  
  82.         System.out.println();
  83.         return sOutput;
  84.     }
  85.  
  86.     private static void sortingStudents(List<Student> studentList, short whatToSort) {
  87.         switch (whatToSort) {
  88.             case 0 -> studentList.sort(Comparator.comparing(Student::getGroupNumberForSorting));
  89.             case 1 -> studentList.sort(Comparator.comparing(Student::getSurname));
  90.             case 2 -> studentList.sort(Comparator.comparing(Student::getAverageScoreForSorting));
  91.         }
  92.     }
  93.  
  94.     private static String[] findRegEx(String sInput, String regEx, String outputIfNothingFound) {
  95.         ArrayList<String> arrStringOutput = new ArrayList<>();
  96.         Pattern pattern = Pattern.compile(regEx);
  97.         Matcher matcher = pattern.matcher(sInput);
  98.  
  99.         if (matcher.find()) {
  100.             do {
  101.                 arrStringOutput.add(matcher.group());
  102.             } while (matcher.find());
  103.         } else
  104.             arrStringOutput.add(outputIfNothingFound);
  105.  
  106.         return arrStringOutput.toArray(new String[0]);
  107.     }
  108.  
  109.     private static List<Integer> getNumbersFromGivenRanges(String input) {
  110.         final String ERR_INCORRECT_INPUT = "Ошибка. Некорректный ввод.";
  111.         final String ERR_INCORRECT_NUMBERS = "Ошибка. Некорректные числа (число).";
  112.         final String REG_EX_RANGE = "\\b\\d+ *- *\\d+\\b";
  113.         final String REG_EX_ANY_NUMBER = "\\b\\d+\\b";
  114.  
  115.         List<Integer> output = new ArrayList<>();
  116.         boolean isCorrect = true;
  117.  
  118.         input = input.trim();
  119.         String[] arrOfRanges = findRegEx(input, REG_EX_RANGE, "");
  120.  
  121.         if (!arrOfRanges[0].equals("")) {
  122.             int n1 = 0;
  123.             int n2 = 0;
  124.             int i = 0;
  125.             String range;
  126.  
  127.             while (isCorrect && i < arrOfRanges.length) {
  128.                 range = arrOfRanges[i];
  129.  
  130.                 try {
  131.                     n1 = Integer.parseInt(findRegEx(range, "\\d+ *-", "")[0].
  132.                             replaceAll(" *-", ""));
  133.                     n2 = Integer.parseInt(findRegEx(range, "- *\\d+", "")[0].
  134.                             replaceAll("- *", ""));
  135.                 } catch (NumberFormatException e) {
  136.                     System.out.println(ERR_INCORRECT_INPUT);
  137.                     isCorrect = false;
  138.                 }
  139.  
  140.                 if (isCorrect && (n1 > n2 || n1 < 1 || n2 > students.size())) {
  141.                     System.out.println(ERR_INCORRECT_NUMBERS);
  142.                     isCorrect = false;
  143.                 }
  144.  
  145.                 if (isCorrect) {
  146.                     for (int j = n1; j < n2 + 1; j++) {
  147.                         if (!output.contains(j)) {
  148.                             output.add(j);
  149.                         }
  150.                     }
  151.                 }
  152.  
  153.                 i++;
  154.             }
  155.         }
  156.  
  157.         String[] arrOfSingleNumbers = findRegEx(input.replaceAll(REG_EX_RANGE, ""), REG_EX_ANY_NUMBER, "");
  158.         if (isCorrect && !arrOfSingleNumbers[0].equals("")) {
  159.             int i = 0;
  160.             int n = 0;
  161.  
  162.             while (isCorrect && i < arrOfSingleNumbers.length) {
  163.                 try {
  164.                     n = Integer.parseInt(arrOfSingleNumbers[i]);
  165.                 } catch (NumberFormatException e) {
  166.                     System.out.println(ERR_INCORRECT_INPUT);
  167.                     isCorrect = false;
  168.                 }
  169.  
  170.                 if (isCorrect && (n < 1 || n > students.size())) {
  171.                     System.out.println(ERR_INCORRECT_NUMBERS);
  172.                     isCorrect = false;
  173.                 }
  174.  
  175.                 if (isCorrect) {
  176.                     if (!output.contains(n)) {
  177.                         output.add(n);
  178.                     }
  179.                 }
  180.  
  181.                 i++;
  182.             }
  183.         }
  184.  
  185.         return output;
  186.     }
  187.  
  188.     private static void showStudentInfo(Student student, int numberBeforeStudent) {
  189.         String output = String.format("%-5d %-9s  %-16s  %-6d %-6d %-6d %-6d", numberBeforeStudent, student.getGroupNumber(),
  190.                 student.getSurname(), student.getGradeMath(), student.getGradePhys(), student.getGradeProgramming(),
  191.                 student.getGradeEngGraph());
  192.         output = output.replaceAll("\\b0\\b", " ");
  193.         System.out.println(output);
  194.     }
  195.  
  196.     private static void showData(List<Student> studentList, boolean shouldBeSortedByGroupAndAlphabet) {
  197.         if (shouldBeSortedByGroupAndAlphabet) {
  198.             sortedBy = 0;
  199.         }
  200.         switch (sortedBy) {
  201.             case 0 -> System.out.println("Таблица отсортирована по умолчанию (по группам и по алфавиту внутри групп).");
  202.             case 1 -> System.out.println("Таблица отсортирована по алфавиту.");
  203.             case 2 -> System.out.println("Таблица отсортирована по среднему баллу по убыванию.");
  204.             case 3 -> System.out.println("Таблица отсортирована по среднему баллу по возрастанию.");
  205.         }
  206.         if (nowFilteredGroup) {
  207.             System.out.println("Показаны только студенты группы " + studentsCopy.get(0).getGroupNumber() + ".");
  208.         }
  209.         if (nowFilteredAvScore) {
  210.             System.out.println("Включен фильтр среднего балла.");
  211.         }
  212.  
  213.         System.out.println("\nСведения о результатах комплексной контрольной.");
  214.         System.out.printf(FORMAT_FOR_SPREADSHEET, "№", "Группа", "Фамилия", "Матем", "Физика", "Прогр", "ИнжГр");
  215.  
  216.         if (shouldBeSortedByGroupAndAlphabet) {
  217.             sortingStudents(studentList, (short) 1); // по фамилии и потом сразу по номеру группы
  218.             sortingStudents(studentList, (short) 0);
  219.         }
  220.  
  221.         int i = 1;
  222.         for (Student student : studentList) {
  223.             showStudentInfo(student, i);
  224.             i++;
  225.         }
  226.         System.out.println();
  227.     }
  228.  
  229.     private static void deleteStudents() {
  230.         final String HELP_SEQUENCE_OF_NUMBERS_INPUT = "Например: \"2, 3, 5-12, 49\"";
  231.  
  232.         dataISSaved = false;
  233.         List<Integer> integerList = new ArrayList<>();
  234.         boolean processIsNotAborted = true;
  235.  
  236.         do {
  237.             String strNumbers = getAnythingFromConsole("Введите номера студентов, которых нужно удалить " +
  238.                             "из списка.\n" + HELP_SEQUENCE_OF_NUMBERS_INPUT + "\n" + MES_PRESS_ENTER_TO_STOP,
  239.                     REG_EX_FOR_SEQUENCES + "|^$", "Надо перечислять номера студентов, которых вы хотите удалить из " +
  240.                             "списка через запятые.\nМожно использовать дефис для последовательностей чисел.\n" +
  241.                             HELP_SEQUENCE_OF_NUMBERS_INPUT);
  242.  
  243.             if (strNumbers.equals("")) {
  244.                 processIsNotAborted = false;
  245.             } else {
  246.                 integerList = getNumbersFromGivenRanges(strNumbers);
  247.                 integerList.sort(Comparator.comparing(Integer::intValue));
  248.                 Collections.reverse(integerList);
  249.  
  250.                 if (integerList.size() > 0) {
  251.                     for (int i : integerList) {
  252.                         students.remove(studentsCopy.get(i - 1));
  253.                         studentsCopy.remove(i - 1);
  254.                     }
  255.                 }
  256.             }
  257.         } while (integerList.size() < 1 && processIsNotAborted);
  258.     }
  259.  
  260.     private static int getOneIntegerFromConsoleAndCanBeAborted(final String question, final int N_MIN, final int N_MAX) {
  261.         final String ERR_INPUT = "Надо ввести число от " + N_MIN + " до " + N_MAX;
  262.         String answer;
  263.         boolean isInCorrect;
  264.         int n = 0;
  265.  
  266.         do {
  267.             isInCorrect = false;
  268.             answer = getAnythingFromConsole(question + "\n" + MES_PRESS_ENTER_TO_STOP, "^$|^\\d+$", ERR_INPUT);
  269.             if (!answer.equals("")) {
  270.                 try {
  271.                     n = Integer.parseInt(answer);
  272.                 } catch (NumberFormatException e) {
  273.                     System.out.println(ERR_INPUT);
  274.                     isInCorrect = true;
  275.                 }
  276.                 if (!isInCorrect && (n < N_MIN || n > N_MAX)) {
  277.                     System.out.println(ERR_INPUT);
  278.                     isInCorrect = true;
  279.                 }
  280.             }
  281.         } while (isInCorrect);
  282.  
  283.         return n;
  284.     }
  285.  
  286.     private static void changeStudent() {
  287.         final String MES_QUESTION = "Введите номер студента, данные которого следует изменить.";
  288.         dataISSaved = false;
  289.         int n = getOneIntegerFromConsoleAndCanBeAborted(MES_QUESTION, 1, studentsCopy.size()) - 1;
  290.  
  291.         System.out.println("Было:");
  292.         System.out.printf(FORMAT_FOR_SPREADSHEET, "№", "Группа", "Фамилия", "Матем", "Физика",
  293.                 "Прогр", "ИнжГр");
  294.         showStudentInfo(studentsCopy.get(n), n + 1);
  295.         boolean processIsDone = addNewStudent("Теперь введите новые данные этого студента. ",
  296.                 "Данные студента успешно изменены.");
  297.         if (processIsDone) {
  298.             students.remove(studentsCopy.get(n));
  299.         }
  300.     }
  301.  
  302.     private static void sortStudents() {
  303.         short answerOnQuestion = choose("Сортировать по...", new String[]{"группе",
  304.                 "алфавиту", "среднему баллу по убыванию",
  305.                 "среднему баллу по возрастанию", "назад"});
  306.         switch (answerOnQuestion) {
  307.             case 0 -> {
  308.                 sortingStudents(studentsCopy, (short) 1);
  309.                 sortingStudents(studentsCopy, (short) 0);
  310.             }
  311.             case 1 -> {
  312.                 sortingStudents(studentsCopy, (short) 0);
  313.                 sortingStudents(studentsCopy, (short) 1);
  314.             }
  315.             case 2 -> {
  316.                 sortingStudents(studentsCopy, (short) 1);
  317.                 sortingStudents(studentsCopy, (short) 0);
  318.                 sortingStudents(studentsCopy, (short) 2);
  319.                 Collections.reverse(studentsCopy);
  320.             }
  321.             case 3 -> {
  322.                 sortingStudents(studentsCopy, (short) 1);
  323.                 sortingStudents(studentsCopy, (short) 0);
  324.                 sortingStudents(studentsCopy, (short) 2);
  325.             }
  326.         }
  327.         sortedBy = answerOnQuestion;
  328.     }
  329.  
  330.     private static void filterByGroup() {
  331.         final String ERR_NO_SUCH_GROUP_EXIST = "Ни одного человека с таким номером группы не найдено.";
  332.  
  333.         boolean isNotReady = true;
  334.         do {
  335.             String groupNumber = getAnythingFromConsole("Введите номер группы.\n" + MES_PRESS_ENTER_TO_STOP,
  336.                     "^$|^\\d+$", "Надо ввести последовательность цифр.")
  337.                     .replaceAll("\\b0+\\b", "0");
  338.             if (groupNumber.equals("")) {
  339.                 isNotReady = false;
  340.             } else if (groupNumber.equals("0")) {
  341.                 System.out.println(ERR_NO_SUCH_GROUP_EXIST);
  342.             } else {
  343.                 List<Student> studentsCopyCopy = new ArrayList<>(studentsCopy);
  344.                 studentsCopyCopy.removeIf(st -> !st.getGroupNumber().equals(groupNumber));
  345.                 if (studentsCopyCopy.size() > 0) {
  346.                     studentsCopy = studentsCopyCopy;
  347.                     isNotReady = false;
  348.                     nowFilteredGroup = true;
  349.                 } else {
  350.                     System.out.println(ERR_NO_SUCH_GROUP_EXIST);
  351.                 }
  352.             }
  353.         } while (isNotReady);
  354.     }
  355.  
  356.     private static void filterByAverageScore() {
  357.         final String ERR_NO_RESULTS = "Ни одного человека с подходящим средним баллом не найдено.";
  358.         boolean moreThan = choose("Средний балл должен быть...", new String[]{"больше или равен...",
  359.                 "меньше или равен..."}) == (short) 0;
  360.  
  361.         boolean isNotReady = true;
  362.         do {
  363.             int number = getOneIntegerFromConsoleAndCanBeAborted("введите число, с которым нужно сравнивать:",
  364.                     1, 10);
  365.  
  366.             if (number > 0) {
  367.                 List<Student> studentsCopyCopy = new ArrayList<>(studentsCopy);
  368.  
  369.                 if (moreThan) {
  370.                     studentsCopyCopy.removeIf(st -> st.getAverageScoreForSorting() < number);
  371.                 } else {
  372.                     studentsCopyCopy.removeIf(st -> st.getAverageScoreForSorting() > number);
  373.                 }
  374.  
  375.                 if (studentsCopyCopy.size() > 0) {
  376.                     studentsCopy = studentsCopyCopy;
  377.                     isNotReady = false;
  378.                     nowFilteredAvScore = true;
  379.                 } else {
  380.                     System.out.println(ERR_NO_RESULTS);
  381.                 }
  382.             } else {
  383.                 isNotReady = false;
  384.             }
  385.         } while (isNotReady);
  386.     }
  387.  
  388.     private static void filterAndSortReset() {
  389.         sortingStudents(students, (short) 1);
  390.         sortingStudents(students, (short) 0);
  391.         studentsCopy = new ArrayList<>(students);
  392.         nowFilteredAvScore = false;
  393.         nowFilteredGroup = false;
  394.         sortedBy = 0;
  395.     }
  396.  
  397.     private static void filterStudents() {
  398.         final String[] OPTIONS = new String[]{"убрать все фильтры и сбросить сортировку",
  399.                 "добавить фильтр по группе", "добавить фильтр по среднему баллу", "назад"};
  400.  
  401.         String[] options;
  402.         if (!nowFilteredAvScore && !nowFilteredGroup) {
  403.             options = new String[]{OPTIONS[1], OPTIONS[2], OPTIONS[3]};
  404.         } else if (!nowFilteredAvScore) {
  405.             options = new String[]{OPTIONS[0], OPTIONS[2], OPTIONS[3]};
  406.         } else if (!nowFilteredGroup) {
  407.             options = new String[]{OPTIONS[0], OPTIONS[1], OPTIONS[3]};
  408.         } else {
  409.             options = new String[]{OPTIONS[0], OPTIONS[3]};
  410.         }
  411.  
  412.         short answerOnQuestion = choose("Фильтры", options);
  413.  
  414.         if (options.length == 3) {
  415.             if (options[0].equals(OPTIONS[0])) {
  416.                 switch (answerOnQuestion) {
  417.                     case 0 -> filterAndSortReset();
  418.                     case 1 -> {
  419.                         if (options[1].equals(OPTIONS[1])) {
  420.                             filterByGroup();
  421.                         } else {
  422.                             filterByAverageScore();
  423.                         }
  424.                     }
  425.                 }
  426.             } else {
  427.                 switch (answerOnQuestion) {
  428.                     case 0 -> filterByGroup();
  429.                     case 1 -> filterByAverageScore();
  430.                 }
  431.             }
  432.         } else if (answerOnQuestion == 0) {
  433.             filterAndSortReset();
  434.         }
  435.     }
  436.  
  437.     private static void watchData() {
  438.         short answerOnQuestion;
  439.         boolean isSorted = false;
  440.         filterAndSortReset();
  441.  
  442.         do {
  443.             if (students.size() < 1) {
  444.                 System.err.println("База данных пуста.\n");
  445.                 answerOnQuestion = 5;
  446.             } else {
  447.                 showData(studentsCopy, !isSorted);
  448.  
  449.                 answerOnQuestion = choose("Просмотр и изменение данных", new String[]{"добавить студента(ов)",
  450.                         "удалить студента(ов)", "изменить информацию об одном студенте",
  451.                         "сортировать по...", "фильтры...", "назад"});
  452.                 switch (answerOnQuestion) {
  453.                     case 0 -> {
  454.                         addNewStudents();
  455.                         filterAndSortReset();
  456.                         isSorted = false;
  457.                     }
  458.                     case 1 -> deleteStudents();
  459.                     case 2 -> {
  460.                         changeStudent();
  461.                         filterAndSortReset();
  462.                         isSorted = false;
  463.                     }
  464.                     case 3 -> {
  465.                         sortStudents();
  466.                         isSorted = true;
  467.                     }
  468.                     case 4 -> filterStudents();
  469.                 }
  470.                 System.out.println();
  471.             }
  472.         } while (answerOnQuestion != 5);
  473.     }
  474.  
  475.     private static void addNewStudentBasedOnString(String input) {
  476.         short gradeMath;
  477.         short gradePhys = 0;
  478.         short gradeProgramming = 0;
  479.         short gradeEngGraph = 0;
  480.  
  481.         String groupNumberWithSurname = findRegEx(input, REG_EX_FOR_GROUP_NUMBER_PLUS_SURNAME, "")[0];
  482.         String groupNumber = groupNumberWithSurname.replaceAll(REG_EX_FOR_SURNAME, "").trim().
  483.                 replaceAll("\\b0+\\b", "");
  484.         String surname = findRegEx(input, REG_EX_FOR_SURNAME, "")[0];
  485.         String gradesWithSurname = findRegEx(input, REG_EX_FOR_SURNAME + " *" + REG_EX_FOR_ALL_GRADES, "")[0];
  486.         String grades = gradesWithSurname.replaceAll(REG_EX_FOR_SURNAME, "").trim();
  487.         String[] arrGrades = findRegEx(grades, REG_EX_FOR_GRADE, "0");
  488.  
  489.         gradeMath = Short.parseShort(arrGrades[0].equals("-") ? "0" : arrGrades[0]);
  490.         if (arrGrades.length > 1) {
  491.             gradePhys = Short.parseShort(arrGrades[1].equals("-") ? "0" : arrGrades[1]);
  492.         }
  493.         if (arrGrades.length > 2) {
  494.             gradeProgramming = Short.parseShort(arrGrades[2].equals("-") ? "0" : arrGrades[2]);
  495.         }
  496.         if (arrGrades.length > 3) {
  497.             gradeEngGraph = Short.parseShort(arrGrades[3].equals("-") ? "0" : arrGrades[3]);
  498.         }
  499.  
  500.         students.add(new Student(groupNumber, surname, gradeMath, gradePhys, gradeProgramming, gradeEngGraph));
  501.     }
  502.  
  503.     private static boolean addNewStudent(final String MES_QUESTION, final String MES_PROCESS_DONE) {
  504.         String input = getAnythingFromConsole(MES_QUESTION + MES_PRESS_ENTER_TO_STOP + ": ",
  505.                 "^$|^(" + REG_EX_FOR_WHOLE_STUDENT + ")$",
  506.                 "Номером группы может являться последовательность цифр длиной до 9-ти. Фамилия может " +
  507.                         "состоять из букв и знаков \"-\" (от 2-ух до 16-ти символов).");
  508.  
  509.         if (!input.equals("")) {
  510.             dataISSaved = false;
  511.             addNewStudentBasedOnString(input);
  512.             System.out.println(MES_PROCESS_DONE);
  513.         }
  514.         return !input.equals("");
  515.     }
  516.  
  517.     private static void addNewStudents() {
  518.         final String MES_QUESTION = "Введите информацию о студенте. ";
  519.         final String MES_PROCESS_DONE = "Студент успешно добавлен.\n";
  520.  
  521.         boolean processIsNotAborted;
  522.         do {
  523.             processIsNotAborted = addNewStudent(MES_QUESTION, MES_PROCESS_DONE);
  524.         } while (processIsNotAborted);
  525.     }
  526.  
  527.     private static void manageData() {
  528.         short answerOnQuestion;
  529.  
  530.         do {
  531.             answerOnQuestion = choose("Управление данными", new String[]{"просмотреть данные",
  532.                     "добавить студента(ов)", "помощь по вводу информации о студенте",
  533.                     "сохранить как...", pathToLastFile.equals("") ? "сохранить (сейчас функция недоступна)" :
  534.                     "сохранить в \"" + pathToLastFile + "\"", "выйти в главное меню"});
  535.             switch (answerOnQuestion) {
  536.                 case 0 -> watchData();
  537.                 case 1 -> addNewStudents();
  538.                 case 2 -> System.out.println(HELP_INFO_STUDENT_INPUT);
  539.                 case 3 -> saveDBToFile("");
  540.                 case 4 -> {
  541.                     if (pathToLastFile.equals("")) {
  542.                         System.out.println("Эта функция станет доступна после того, как вы откроете файл или " +
  543.                                 "сохраните данные в файл.\n");
  544.                     } else if (dataISSaved) {
  545.                         System.out.println("Данные уже сохранены.\n");
  546.                     } else {
  547.                         saveDBToFile(pathToLastFile);
  548.                     }
  549.                 }
  550.                 case 5 -> {
  551.                     if (!dataISSaved && choose("Вы уверены, что хотите выйти? " +
  552.                             "Все несохранённые данные будут безвозвратно утеряны.", new String[]{"да", "нет, вернуться"}) == 1) {
  553.                         answerOnQuestion = -1;
  554.                     }
  555.                 }
  556.             }
  557.         } while (answerOnQuestion != 5);
  558.     }
  559.  
  560.     private static void createNewDB() {
  561.         students.clear();
  562.         dataISSaved = true;
  563.         pathToLastFile = "";
  564.  
  565.         System.out.println(HELP_INFO_STUDENT_INPUT);
  566.  
  567.         addNewStudents();
  568.     }
  569.  
  570.     private static void saveDBToFile(String sPathToFile) {
  571.         final String MES_OUTPUT_DONE = "Данные успешно записаны в файл.\n";
  572.         final String ERROR_COULD_NOT_OPEN_OR_CREATE_OR_WRITE_FILE = "Ошибка. Не удалось создать, открыть или записать " +
  573.                 "текстовый файл в заданной Вами директории.";
  574.  
  575.         sortingStudents(students, (short) 1); // по фамилии и потом сразу по номеру группы
  576.         sortingStudents(students, (short) 0);
  577.  
  578.         boolean isNotCorrect = true;
  579.         boolean processIsNotAborted = true;
  580.         boolean loopIsNotFirstTime = false;
  581.         do {
  582.             if (sPathToFile.equals("") || loopIsNotFirstTime) {
  583.                 sPathToFile = getAnythingFromConsole(ASK_PATH_TO_FILE, REG_EX_PATH_TO_TXT_FILE,
  584.                         CLARIFICATION_ASK_PATH_TO_FILE);
  585.             }
  586.             loopIsNotFirstTime = true;
  587.             if (sPathToFile.equals("")) {
  588.                 processIsNotAborted = false;
  589.             } else {
  590.                 if (Files.exists(Paths.get(sPathToFile)) && choose("Файл \"" + sPathToFile +
  591.                         "\" уже существует.\n" + "Вы уверены, что хотите перезаписать файл? Все текущие данные в этом " +
  592.                         "файле будут безвозвратно утеряны.", new String[]{"да, перезаписать файл.",
  593.                         "нет, выбрать другой файл."}) == 0) {
  594.                     try (BufferedWriter bufferedWriter = new BufferedWriter(new FileWriter(new File(sPathToFile)))) {
  595.                         for (Student st : students) {
  596.                             bufferedWriter.append(st.getAllInfo()).append("\n");
  597.                         }
  598.                         isNotCorrect = false;
  599.                         System.out.println(MES_OUTPUT_DONE);
  600.                         dataISSaved = true;
  601.                         pathToLastFile = sPathToFile;
  602.                     } catch (java.io.IOException e) {
  603.                         System.out.println(ERROR_COULD_NOT_OPEN_OR_CREATE_OR_WRITE_FILE);
  604.                     }
  605.                 }
  606.             }
  607.         } while (isNotCorrect && processIsNotAborted);
  608.     }
  609.  
  610.     private static boolean openDBFromFile() {
  611.         final String MES_INPUT_DONE = "Данные успешно импортированы.\n";
  612.         final String ERROR_COULD_NOT_OPEN_OR_READ_FILE = "Ошибка. Не удалось открыть или прочитать " +
  613.                 "текстовый файл в заданной Вами директории.";
  614.  
  615.         boolean isNotCorrect = true;
  616.         boolean processIsNotAborted = true;
  617.         do {
  618.             String sPathToFile = getAnythingFromConsole(ASK_PATH_TO_FILE, REG_EX_PATH_TO_TXT_FILE,
  619.                     CLARIFICATION_ASK_PATH_TO_FILE);
  620.  
  621.             if (sPathToFile.equals("")) {
  622.                 processIsNotAborted = false;
  623.             } else {
  624.                 try (BufferedReader bufferedReader = new BufferedReader(new FileReader(new File(sPathToFile)))) {
  625.                     String temp;
  626.                     students.clear();
  627.                     boolean isCorrect = true;
  628.                     do {
  629.                         temp = bufferedReader.readLine();
  630.                         if (temp != null) {
  631.                             temp = temp.replaceAll("\\b0\\b", "-");
  632.                             if (findRegEx(temp, REG_EX_FOR_WHOLE_STUDENT, "")[0].equals("")) {
  633.                                 System.out.println("Ошибка. Как минимум одна строка в файле записана неверно. " +
  634.                                         "Не удалось импортировать данные.");
  635.                                 isCorrect = false;
  636.                                 students.clear();
  637.                             } else {
  638.                                 addNewStudentBasedOnString(temp);
  639.                             }
  640.                         }
  641.                     } while (temp != null && isCorrect);
  642.                     if (isCorrect) {
  643.                         isNotCorrect = false;
  644.                         System.out.println(MES_INPUT_DONE);
  645.                         dataISSaved = true;
  646.                         pathToLastFile = sPathToFile;
  647.                     }
  648.                 } catch (java.io.IOException e) {
  649.                     System.out.println(ERROR_COULD_NOT_OPEN_OR_READ_FILE);
  650.                 }
  651.             }
  652.         } while (isNotCorrect && processIsNotAborted);
  653.         return processIsNotAborted;
  654.     }
  655.  
  656.     private static void showHelp() {
  657.         short answerOnQuestion;
  658.         do {
  659.             answerOnQuestion = choose("Справка", new String[]{"о программе", "задание", "автор", "назад"});
  660.             switch (answerOnQuestion) {
  661.                 case 0 -> System.out.println("О программе:\n" +
  662.                         "\tВы можете просматривать базу данных, изменять её компоненты, добавлять и удалять строки.\n" +
  663.                         "\tВы также можете сортировать и фильровать данные.\n");
  664.                 case 1 -> System.out.println("Задание:\n\tВывести в алфавитном порядке список тех студентов группы Х" +
  665.                         ", у которых средний балл за контрольную 7 и выше.\n");
  666.                 case 2 -> System.out.println("Автор:\n\tПанев Александр, гр. 051007\n\tМинск, 2021\n");
  667.             }
  668.         } while (answerOnQuestion != 3);
  669.     }
  670.  
  671.     private static void mainMenu() {
  672.         short answerOnQuestion;
  673.         do {
  674.             answerOnQuestion = choose("Главное меню",
  675.                     new String[]{"создать новую базу", "открыть имеющуюся базу из файла", "показать справку", "закрыть программу"});
  676.             switch (answerOnQuestion) {
  677.                 case 0 -> {
  678.                     createNewDB();
  679.                     manageData();
  680.                 }
  681.                 case 1 -> {
  682.                     if (openDBFromFile()) {
  683.                         manageData();
  684.                     }
  685.                 }
  686.                 case 2 -> showHelp();
  687.             }
  688.         } while (answerOnQuestion != 3);
  689.     }
  690.  
  691.     public static void main(String[] args) {
  692.         scConsole = new Scanner(System.in);
  693.         System.out.println("Добро пожаловать в программу \"Laba 4.1 - Панев Александр, гр. 051007\"\n");
  694.  
  695.         // /Users/sasha/Documents/___Университет/ОАиП/Пз/Лабы/блок 4/laba 4_1/data.txt
  696.  
  697.         mainMenu();
  698.         System.out.println("До свидания");
  699.  
  700.         scConsole.close();
  701.     }
  702. }
  703.  
Advertisement
Add Comment
Please, Sign In to add comment