Advertisement
THOMAS_SHELBY_18

Lab5_1 JAVA ух

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