Advertisement
Vladislav8653

5.2 java

Apr 29th, 2023 (edited)
122
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Java 14.03 KB | None | 0 0
  1. import java.io.*;
  2. import java.util.ArrayList;
  3. import java.util.Objects;
  4. import java.util.Scanner;
  5.  
  6. public class Main {
  7.  
  8.     static Scanner scanner = new Scanner(System.in);
  9.     public static boolean exit = false;
  10.     public static Tree tree = new Tree();
  11.     public static ArrayList<Integer> keys = new ArrayList<>();
  12.     public static void main (String[] args) throws IOException{
  13.         System.out.println("The program demonstrate tree as a data structure.");
  14.         while (!exit) {
  15.             showInfo();
  16.             chooseAction();
  17.         }
  18.     }
  19.  
  20.     public static void showInfo () {
  21.         System.out.println("1 - build an empty tree");
  22.         System.out.println("2 - add a new item in the tree");
  23.         System.out.println("3 - remove an item from the tree");
  24.         System.out.println("4 - show tree");
  25.         System.out.println("5 - open tree from file");
  26.         System.out.println("6 - save tree in file");
  27.         System.out.println("7 - exit");
  28.     }
  29.     private static int inputData() {
  30.         int n = 0;
  31.         boolean isIncorrect;
  32.         final int MIN_SIZE = 1;
  33.         do {
  34.             isIncorrect = false;
  35.             try {
  36.                 n = Integer.parseInt(scanner.nextLine());
  37.             } catch (Exception e) {
  38.                 isIncorrect = true;
  39.                 System.out.println("Please enter an integer number");
  40.             }
  41.             if (n < MIN_SIZE && !isIncorrect) {
  42.                 System.out.println("Please enter a positive number");
  43.                 isIncorrect = true;
  44.             }
  45.         } while (isIncorrect);
  46.         return n;
  47.     }
  48.  
  49.     private static int inputKey() {
  50.         int n = 0;
  51.         boolean isIncorrect;
  52.         do {
  53.             isIncorrect = false;
  54.             try {
  55.                 n = Integer.parseInt(scanner.nextLine());
  56.             } catch (Exception e) {
  57.                 isIncorrect = true;
  58.                 System.out.println("Please enter an integer number");
  59.             }
  60.         } while (isIncorrect);
  61.         return n;
  62.     }
  63.  
  64.     public static void chooseAction () throws IOException {
  65.         int chose;
  66.         boolean isIncorrect;
  67.         final int MAX = 8;
  68.         System.out.println("Please, choose:");
  69.  
  70.         do {
  71.             chose = inputData();
  72.             isIncorrect = false;
  73.             if ((chose > MAX) || (chose < 1)) {
  74.                 isIncorrect = true;
  75.                 System.out.println("Please enter the correct function number.");
  76.             }
  77.         } while (isIncorrect);
  78.  
  79.         switch (chose) {
  80.             case 1 -> buildTree();
  81.             case 2 -> addNode();
  82.             case 3 -> removeNode();
  83.             case 4 -> showTree();
  84.             case 5 -> openFile();
  85.             case 6 -> saveData();
  86.             case 7 -> exit = true;
  87.         }
  88.     }
  89.  
  90.     public static void buildTree () {
  91.         tree.createTree();
  92.         System.out.println("Ready!");
  93.         System.out.println(); // просто пустая строка для удобства чтения
  94.     }
  95.  
  96.     public static boolean checkExistenceOrUniqueness (int nodeToDelete) {
  97.         for (Integer key : keys) {
  98.             if (nodeToDelete == key) {
  99.                 return true;
  100.             }
  101.         }
  102.         return false;
  103.     }
  104.  
  105.     public static boolean checkUniqueness (int[] keysFromFile) {
  106.         for (int i = 0; i < keysFromFile.length; i++){
  107.             for (int j = i + 1; j < keysFromFile.length; j++){
  108.                 if (keysFromFile[i] == keysFromFile[j]) {
  109.                     System.out.println("There is(are) repetition(s) in your file. Change raw data.");
  110.                     return false;
  111.                 }
  112.             }
  113.         }
  114.         for (int i = 0; i < keysFromFile.length; i++) {
  115.             if (keys.contains(keysFromFile[i])) {
  116.                 System.out.println("Element(s) which is(are) tried to be added already exist(s). Change raw data.");
  117.                 return false;
  118.             }
  119.         }
  120.         return true;
  121.     }
  122.  
  123.     public static void addNode () {
  124.         System.out.println("Input node:");
  125.         int node = inputKey();
  126.         if (checkExistenceOrUniqueness(node)) {
  127.             System.out.println("Unfortunately it is impossible to add node which already exists. Enter again.");
  128.         } else {
  129.             tree.addNode(node);
  130.             keys.add(node);
  131.             System.out.println("Node \"" + node +"\" added.");
  132.         }
  133.         System.out.println(); // просто пустая строка для удобства чтения
  134.     }
  135.  
  136.     public static void removeNode () {
  137.         System.out.println("Input an item for deleting.");
  138.         int nodeToDelete = inputKey();
  139.         int index;
  140.         if (tree.getRoot() != null) {
  141.             if (checkExistenceOrUniqueness(nodeToDelete)) {
  142.                 tree.deleteNode(nodeToDelete);
  143.                 index = keys.indexOf(nodeToDelete);
  144.                 keys.remove(index);
  145.                 System.out.println("Ready!");
  146.             } else
  147.                 System.out.println("There is no such node.");
  148.         } else {
  149.             System.out.println("Tree is empty.");
  150.         }
  151.         System.out.println(); // просто пустая строка для удобства чтения
  152.     }
  153.  
  154.     public static void showTree () {
  155.         if (tree.getRoot() != null) {
  156.             System.out.println("For better user experience turn your monitor clockwise)");
  157.             Tree root = tree.getRoot();
  158.             tree.printTree(root, 0);
  159.         } else {
  160.             System.out.println("Tree is empty.");
  161.         }
  162.         System.out.println(); // просто пустая строка для удобства чтения
  163.     }
  164.  
  165.     public static String inputFilePath() {
  166.         String path;
  167.         boolean isIncorrect;
  168.         do {
  169.             isIncorrect = false;
  170.             System.out.println("Input file path:");
  171.             path = scanner.nextLine();
  172.             File file = new File(path);
  173.             if (!file.exists()) {
  174.                 System.out.println("Wrong way to file.");
  175.                 isIncorrect = true;
  176.             }
  177.             if (!file.canRead() && file.exists()) {
  178.                 System.out.println("Impossible to read a file.");
  179.                 isIncorrect = true;
  180.             }
  181.             if (!file.canWrite() && file.canRead()) {
  182.                 System.out.println("Impossible to write a file.");
  183.                 isIncorrect = true;
  184.             }
  185.         } while (isIncorrect);
  186.         return path;
  187.     }
  188.  
  189.     public static String[] deleteSpacesInArray (String[] keys) {
  190.         int counterOfSpaces = 0;
  191.         for (int j = 0; j < keys.length; j++) {
  192.             if (!Objects.equals(keys[j], "")) {
  193.                 counterOfSpaces++;
  194.             }
  195.         }
  196.         int i = 0;
  197.         String[] newArr = new String[counterOfSpaces];
  198.         for (int j = 0; j < keys.length; j++) {
  199.             if (!Objects.equals(keys[j], "")) {
  200.                 newArr[i] = keys[j];
  201.                 i++;
  202.             }
  203.         }
  204.         return newArr;
  205.     }
  206.     public static boolean checkArrayOfStrings (String[] keys) {
  207.         for (int j = 0; j < keys.length; j++){
  208.             try {
  209.                 Integer.parseInt(keys[j]);
  210.             } catch (Exception e) {
  211.                 System.out.println("Check file, it shouldn't contains smth except numbers.");
  212.                 return false;
  213.             }
  214.         }
  215.         return true;
  216.     }
  217.  
  218.     public static int[] getArrOfKeys (String[] keys) {
  219.         int[] keysFromFile = new int[keys.length];
  220.         for (int j = 0; j < keys.length; j++) {
  221.             keysFromFile[j] = Integer.parseInt(keys[j]);
  222.         }
  223.         return keysFromFile;
  224.     }
  225.     public static void openFile () {
  226.         System.out.println("Example of string with tree's nodes:");
  227.         System.out.println("node1 - node2 - node3 - ... - nodeN");
  228.         System.out.println("P.S. after every position expected only space. Nodes from file will be added to existed tree.");
  229.         String path = inputFilePath();
  230.         String str;
  231.         String[] mas;
  232.         try {
  233.             Scanner fileReader = new Scanner(new File(path));
  234.             str = fileReader.nextLine();
  235.             mas = str.split(" ");
  236.             mas = deleteSpacesInArray(mas);
  237.             if (checkArrayOfStrings(mas)) {
  238.                 int[] keysFromFile = getArrOfKeys(mas);
  239.                 if (checkUniqueness(keysFromFile)) {
  240.                     for (int j = 0; j < keysFromFile.length; j++) {
  241.                         tree.addNode(keysFromFile[j]);
  242.                         keys.add(keysFromFile[j]);
  243.                     }
  244.                     System.out.println("Ready!");
  245.                 }
  246.             }
  247.         } catch (Exception q) {
  248.             System.out.println("Something went wrong, check file.");
  249.         }
  250.     }
  251.     public static void saveData () throws IOException {
  252.         if (tree.getRoot() != null) {
  253.             String path = inputFilePath();
  254.             FileWriter writer = new FileWriter(path);
  255.             String result = "";
  256.             for (Integer key: keys) {
  257.                 result = result + Integer.toString(key) + " ";
  258.             }
  259.             writer.write(result);
  260.             writer.close();
  261.             System.out.println("Ready!");
  262.         } else {
  263.             System.out.println("Tree is empty, add some nodes!");
  264.         }
  265.     }
  266. }
  267. ======================================================class2======================================================
  268. public class Tree {
  269.  
  270.     private int key;
  271.     private Tree leftChild;
  272.     private Tree rightChild;
  273.  
  274.     public static Tree rootNode;
  275.  
  276.     public Tree getRoot() {
  277.         return rootNode;
  278.     }
  279.  
  280.     public int getKey() {
  281.         return this.key;
  282.     }
  283.  
  284.     public void setKey(final int key) {
  285.         this.key = key;
  286.     }
  287.  
  288.     public Tree getLeftChild() {
  289.         return this.leftChild;
  290.     }
  291.  
  292.     public void setLeftChild(final Tree leftChild) {
  293.         this.leftChild = leftChild;
  294.     }
  295.  
  296.     public Tree getRightChild() {
  297.         return this.rightChild;
  298.     }
  299.  
  300.     public void setRightChild(final Tree rightChild) {
  301.         this.rightChild = rightChild;
  302.     }
  303.  
  304.     public void createTree() {
  305.         rootNode = null;
  306.     }
  307.  
  308.     public void addNode(int key) {
  309.         Tree newNode = new Tree();
  310.         newNode.setKey(key);
  311.         if (rootNode == null) {
  312.             rootNode = newNode;
  313.         } else {
  314.             Tree currentNode = rootNode;
  315.             Tree parentNode;
  316.             while (true) {
  317.                 parentNode = currentNode;
  318.                 if (key == currentNode.getKey()) {
  319.                     return;
  320.                 } else if (key < currentNode.getKey()) {
  321.                     currentNode = currentNode.getLeftChild();
  322.                     if (currentNode == null) {
  323.                         parentNode.setLeftChild(newNode);
  324.                         return;
  325.                     }
  326.                 } else {
  327.                     currentNode = currentNode.getRightChild();
  328.                     if (currentNode == null) {
  329.                         parentNode.setRightChild(newNode);
  330.                         return;
  331.                     }
  332.                 }
  333.             }
  334.         }
  335.     }
  336.  
  337.     public void deleteNode(int value) {
  338.         Tree currentNode = rootNode;
  339.         Tree parentNode = rootNode;
  340.         boolean isLeftChild = true;
  341.         while (currentNode.getKey() != value) {
  342.             parentNode = currentNode;
  343.             if (value < currentNode.getKey()) {
  344.                 isLeftChild = true;
  345.                 currentNode = currentNode.getLeftChild();
  346.             }
  347.             else {
  348.                 isLeftChild = false;
  349.                 currentNode = currentNode.getRightChild();
  350.             }
  351.         }
  352.  
  353.         if (currentNode.getLeftChild() == null && currentNode.getRightChild() == null) {
  354.             if (currentNode == rootNode)
  355.                 rootNode = null;
  356.             else if (isLeftChild)
  357.                 parentNode.setLeftChild(null);
  358.             else
  359.                 parentNode.setRightChild(null);
  360.         }
  361.         else if (currentNode.getRightChild() == null) {
  362.             if (currentNode == rootNode)
  363.                 rootNode = currentNode.getLeftChild();
  364.             else if (isLeftChild)
  365.                 parentNode.setLeftChild(currentNode.getLeftChild());
  366.             else
  367.                 parentNode.setRightChild(currentNode.getLeftChild());
  368.         }
  369.         else if (currentNode.getLeftChild() == null) {
  370.             if (currentNode == rootNode)
  371.                 rootNode = currentNode.getRightChild();
  372.             else if (isLeftChild)
  373.                 parentNode.setLeftChild(currentNode.getRightChild());
  374.             else
  375.                 parentNode.setRightChild(currentNode.getRightChild());
  376.         }
  377.         else {
  378.             Tree successor = getSuccessor(currentNode);
  379.             if (currentNode == rootNode)
  380.                 rootNode = successor;
  381.             else if (isLeftChild)
  382.                 parentNode.setLeftChild(successor);
  383.             else
  384.                 parentNode.setRightChild(successor);
  385.         }
  386.     }
  387.  
  388.     private Tree getSuccessor(Tree deleteNode) {
  389.         Tree successorParent = deleteNode;
  390.         Tree successor = deleteNode;
  391.         Tree current = deleteNode.getRightChild();
  392.         while (current != null) {
  393.             successorParent = successor;
  394.             successor = current;
  395.             current = current.getLeftChild();
  396.         }
  397.         if (successor != deleteNode.getRightChild()) {
  398.             successorParent.setLeftChild(successor.getRightChild());
  399.             successor.setRightChild(deleteNode.getRightChild());
  400.         }
  401.         successor.setLeftChild(deleteNode.getLeftChild());
  402.         return successor;
  403.     }
  404.  
  405.  
  406.     public void printTree(Tree node, int level) {
  407.         if (node == null) {
  408.             return;
  409.         }
  410.         printTree(node.getRightChild(), level + 1);
  411.         for (int i = 0; i < level; i++) {
  412.             System.out.print("    ");
  413.         }
  414.         System.out.println(node.getKey());
  415.         printTree(node.getLeftChild(), level + 1);
  416.     }
  417. }
  418.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement