THOMAS_SHELBY_18

Lab7_2 (JAVA)

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