Advertisement
THOMAS_SHELBY_18

Lab5_1 JAVA

Mar 4th, 2024
55
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Java 12.54 KB | Source Code | 0 0
  1. package com.company;
  2.  
  3. import java.io.File;
  4. import java.io.FileNotFoundException;
  5. import java.io.FileWriter;
  6. import java.io.IOException;
  7. import java.util.Collections;
  8. import java.util.LinkedList;
  9. import java.util.Scanner;
  10.  
  11. public class Main {
  12.     private static final Scanner scan = new Scanner(System.in);
  13.  
  14.     private static void printCondition() {
  15.         System.out.println("Данная программа выполнит слияние двух списков в один");
  16.     }
  17.  
  18.     private static boolean tryConvertStringToInteger (String num, int min, int max) {
  19.         int n;
  20.         boolean isCorrect;
  21.  
  22.         n = 0;
  23.         isCorrect = true;
  24.  
  25.         try {
  26.             n = Integer.parseInt(num);
  27.         }
  28.         catch (Exception err) {
  29.             if (!num.equals("-"))
  30.                 isCorrect = false;
  31.         }
  32.         if (isCorrect && (n < min || n > max))
  33.             isCorrect = false;
  34.  
  35.         return isCorrect;
  36.     }
  37.  
  38.     private static String readNum(int min, int max) {
  39.         boolean isCorrect;
  40.         String num;
  41.  
  42.         do {
  43.             num = scan.nextLine();
  44.             if (!num.equals("-")) {
  45.                 isCorrect = tryConvertStringToInteger(num, min, max);
  46.                 if (!isCorrect)
  47.                     System.out.println("Вы ввели некорректные данные! Попробуйте снова:");
  48.             }
  49.             else
  50.                 isCorrect = true;
  51.         } while (!isCorrect);
  52.  
  53.         return num;
  54.     }
  55.  
  56.     private static int readChoice(){
  57.         int n;
  58.         boolean isCorrect;
  59.         n = 0;
  60.         do {
  61.             isCorrect = true;
  62.             try {
  63.                 n = Integer.parseInt(scan.nextLine());
  64.             }
  65.             catch (Exception err) {
  66.                 System.out.println("Вы ввели некорректные данные. Попробуйте снова");
  67.                 isCorrect = false;
  68.             }
  69.             if (isCorrect && (n < 1 || n > 2)) {
  70.                 System.out.println("Введено значение не входящее в диапазон допустимых значений");
  71.                 isCorrect = false;
  72.             }
  73.         } while (!isCorrect);
  74.         return n;
  75.     }
  76.  
  77.     private static int chooseInputListMethod() {
  78.         int choice;
  79.  
  80.         System.out.println("Выберите вариант ввода:");
  81.         System.out.println("1.Ввод из консоли");
  82.         System.out.println("2.Ввод из файла");
  83.         choice = readChoice();
  84.         return choice;
  85.     }
  86.  
  87.     private static LinkedList<Integer> inputListFromConsole() {
  88.         LinkedList<Integer> list;
  89.         String num;
  90.         int n;
  91.         final int MIN = -1000000, MAX = 1000000;
  92.         list = new LinkedList<>();
  93.  
  94.         num = readNum(MIN, MAX);
  95.  
  96.         while (!num.equals("-")) {
  97.             n = Integer.parseInt(num);
  98.             list.add(n);
  99.  
  100.             num = readNum(MIN, MAX);
  101.         }
  102.  
  103.         Collections.sort(list);
  104.  
  105.         return list;
  106.     }
  107.  
  108.     private static String inputListFromFile() {
  109.         String pathFile;
  110.         boolean isInputFromFileSuccessfully;
  111.  
  112.         System.out.println("Данные в файле должны содержать элементы списка (числа от -1000000 до 1000000), записанные в отдельных строках, затем знак '-', а затем элементы другого списка");
  113.         do {
  114.             System.out.print("Введите путь к файлу и его имя с его раширением:");
  115.             pathFile = scan.nextLine();
  116.             isInputFromFileSuccessfully = checkFile(pathFile);
  117.         } while(!isInputFromFileSuccessfully);
  118.  
  119.         return pathFile;
  120.     }
  121.  
  122.     private static boolean checkFile(String path) {
  123.         final int MIN = -1000000, MAX = 1000000;
  124.         String tempNum;
  125.         File checkFile;
  126.         boolean isFileCorrect;
  127.  
  128.         tempNum = "";
  129.         checkFile = new File(path);
  130.         isFileCorrect = true;
  131.  
  132.         if (!checkFile.isFile()) {
  133.             System.out.println("Файл не найден! Пожалуйста проверьте существование файла и введите путь заново:");
  134.             isFileCorrect = false;
  135.         }
  136.         if (isFileCorrect && !checkFile.canRead() ) {
  137.             System.out.println("Файл не может быть прочитан! Пожалуйста проверьте файл и введите путь заново:");
  138.             isFileCorrect = false;
  139.         }
  140.  
  141.         if (isFileCorrect) {
  142.             try (Scanner fileScan = new Scanner(checkFile)) {
  143.  
  144.                 if (!fileScan.hasNextLine()) {
  145.                     isFileCorrect = false;
  146.                     System.out.println("Файл пустой! Внесите изменения в файл и повторите попытку:");
  147.                 }
  148.  
  149.                 if (isFileCorrect) {
  150.                     while (fileScan.hasNextLine() && isFileCorrect) {
  151.                         tempNum = fileScan.nextLine();
  152.                         isFileCorrect = tryConvertStringToInteger(tempNum, MIN, MAX);
  153.                     }
  154.  
  155.                     if (tempNum.equals("-")) {
  156.                         isFileCorrect = true;
  157.  
  158.                         while (fileScan.hasNextLine() && isFileCorrect) {
  159.                             tempNum = fileScan.nextLine();
  160.                             isFileCorrect = tryConvertStringToInteger(tempNum, MIN, MAX);
  161.                         }
  162.                         if (tempNum.equals("-"))
  163.                             isFileCorrect = true;
  164.                     }
  165.  
  166.                     if (!isFileCorrect)
  167.                         System.out.println("Данные в файле некорректны! Внесите изменения и повторите попытку!");
  168.                 }
  169.             }
  170.             catch (FileNotFoundException e) {
  171.                 System.out.println("Файл по данному пути не существует! Пожалуйста проверьте файл и введите путь заново:");
  172.                 isFileCorrect = false;
  173.             }
  174.         }
  175.         return isFileCorrect;
  176.     }
  177.  
  178.     private static LinkedList<Integer> readFile (Scanner fileScan) {
  179.         String num;
  180.         LinkedList<Integer> list;
  181.  
  182.         list = new LinkedList<>();
  183.  
  184.         num = fileScan.nextLine();
  185.  
  186.         while (fileScan.hasNextLine() && !num.equals("-")) {
  187.             list.add(Integer.parseInt(num));
  188.             num = fileScan.nextLine();
  189.         }
  190.  
  191.         if (!num.equals("-")) {
  192.             list.add(Integer.parseInt(num));
  193.         }
  194.  
  195.         Collections.sort(list);
  196.  
  197.         return list;
  198.     }
  199.  
  200.     private static int chooseOutputListMethod() {
  201.         int choice;
  202.  
  203.         System.out.println("Выберите вариант вывода:");
  204.         System.out.println("1.Вывод в консоль");
  205.         System.out.println("2.Вывод в файл");
  206.         choice = readChoice();
  207.  
  208.         return choice;
  209.     }
  210.  
  211.     private static void outputListToConsole(LinkedList<Integer> list) {
  212.         if (list.size() > 0) {
  213.             for (Integer num : list) {
  214.                 System.out.print(num + " ");
  215.             }
  216.         }
  217.         else {
  218.             System.out.print("Список пуст!");
  219.         }
  220.     }
  221.  
  222.     private static void outputListToFile(LinkedList<Integer> list) {
  223.         String path;
  224.         boolean isFileIncorrect;
  225.  
  226.         System.out.println("Для вывода введите путь к файлу.");
  227.         System.out.println("Если файл отсутствует то он будет создан автоматически по указанному пути или в корневой папке программы (по умолчанию)");
  228.         do {
  229.             isFileIncorrect = false;
  230.             System.out.print("Введите путь к файлу и его имя c расширением: ");
  231.             path = scan.nextLine();
  232.             File outputFile = new File(path);
  233.             try {
  234.                 if (outputFile.isFile()) {
  235.                     if (outputFile.canWrite()) {
  236.                         try (FileWriter writer = new FileWriter(outputFile)) {
  237.                             if (list.size() > 0) {
  238.                                 for (Integer num : list) {
  239.                                     writer.write(num + " ");
  240.                                 }
  241.                             }
  242.                             else {
  243.                                 writer.write("Список пуст!");
  244.                             }
  245.                         }
  246.                     }
  247.                     else {
  248.                         System.out.println("Файл доступен только для чтения!");
  249.                         isFileIncorrect = true;
  250.                     }
  251.                 }
  252.                 else {
  253.                     outputFile.createNewFile();
  254.                     try (FileWriter writer = new FileWriter(outputFile)) {
  255.                         if (list.size() > 0) {
  256.                             for (Integer num : list) {
  257.                                 writer.write(num + " ");
  258.                             }
  259.                         }
  260.                         else {
  261.                             writer.write("Список пуст!");
  262.                         }
  263.                     }
  264.                 }
  265.             }
  266.             catch (IOException e) {
  267.                 System.out.println("Не удалось вывести в файл!");
  268.                 isFileIncorrect = true;
  269.             }
  270.         } while (isFileIncorrect);
  271.         System.out.println("Вывод данных... успешно!");
  272.     }
  273.  
  274.     private static LinkedList<Integer> mergeLists (LinkedList<Integer> firstList, LinkedList<Integer> secondList){
  275.         LinkedList<Integer> resultList;
  276.         int prev;
  277.         int index;
  278.  
  279.         resultList = new LinkedList<>();
  280.         prev = 0;
  281.  
  282.         if (firstList.size() > 0) {
  283.             prev = firstList.get(0);
  284.             resultList.add(prev);
  285.         }
  286.  
  287.         for (Integer i: firstList) {
  288.             if (i != prev) {
  289.                 resultList.add(i);
  290.             }
  291.             prev = i;
  292.         }
  293.  
  294.         index = 0;
  295.         if (resultList.size() > 0) {
  296.             prev = resultList.get(0);
  297.         }
  298.         else
  299.             prev = Integer.MIN_VALUE;
  300.  
  301.  
  302.         for (Integer i: secondList) {
  303.             while (index < resultList.size() && i >=  resultList.get(index)){
  304.                 index++;
  305.             }
  306.             if (index > 0) {
  307.                 prev = resultList.get(index-1);
  308.             }
  309.             if (i != prev) {
  310.                     resultList.add(index, i);
  311.             }
  312.         }
  313.  
  314.         return resultList;
  315.     }
  316.  
  317.     public static void main(String[] args) {
  318.         String path;
  319.         int choice;
  320.         LinkedList<Integer> firstList, secondList, resultList;
  321.         File file;
  322.  
  323.         firstList = new LinkedList<>();
  324.         secondList = new LinkedList<>();
  325.  
  326.         printCondition();
  327.  
  328.         choice = chooseInputListMethod();
  329.         if (choice == 1) {
  330.             System.out.println("Введите элементы первого списка (числа от -1000000 до 1000000), чтобы закончить введите '-':");
  331.             firstList = inputListFromConsole();
  332.             System.out.println("Введите элементы второго списка (числа от -1000000 до 1000000), чтобы закончить введите '-':");
  333.             secondList = inputListFromConsole();
  334.         }
  335.         else {
  336.             path = inputListFromFile();
  337.             file = new File(path);
  338.             try (Scanner fileScan = new Scanner(file)) {
  339.                 firstList = readFile(fileScan);
  340.                 if (fileScan.hasNextLine()) {
  341.                     secondList = readFile(fileScan);
  342.                 }
  343.             }
  344.             catch (FileNotFoundException e) {
  345.                 System.out.println("Файл по данному пути не существует. Пожалуйста проверьте файл и введите путь заново:");
  346.             }
  347.         }
  348.  
  349.         resultList = mergeLists(firstList, secondList);
  350.  
  351.         choice = chooseOutputListMethod();
  352.         if (choice == 1) {
  353.             outputListToConsole(resultList);
  354.         }
  355.         else {
  356.             outputListToFile(resultList);
  357.         }
  358.  
  359.         scan.close();
  360.     }
  361. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement