Vanilla_Fury

laba_4_1_java_v2

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