diff --git a/src/Assignments/A2/Partition.java b/src/Assignments/A2/Partition.java index 3c005fb..9ba513d 100644 --- a/src/Assignments/A2/Partition.java +++ b/src/Assignments/A2/Partition.java @@ -59,7 +59,9 @@ Algorithm Design Block package Assignments.A2; import java.util.ArrayList; +import java.util.Arrays; import java.util.List; +import java.util.Scanner; /** * Generates, if possible, two equal subsets of a given set of elements that are equal to each other. @@ -72,6 +74,155 @@ public class Partition { private int[] set; private List> subsets; + public static void main(String[] args) { + Partition program = new Partition(); + program.start(); + } + + /** + * Used as the main sentential loop and loops until the exit option is selected. + * + * @precondition none + * @postcondition none + */ + public void start() { + int option = this.getOption(); + while (option != 4) { + this.executeOption(option); + option = this.getOption(); + } + } + + /** + * Performs the action related to the option that was chosen. + * + * @precondition none + * @postcondition the action was performed. + * + * @param option the option that was chosen. + */ + private void executeOption(int option) { + if (option == 1) { + System.out.println("Please specify the size of the set."); + System.out.print("Size: "); + int newSize = this.getIntegerInput(); + while (newSize < 1) { + System.out.println("Please enter a valid set size."); + System.out.print("Size: "); + newSize = this.getIntegerInput(); + } + this.set = new int[newSize]; + } if (option == 2) { + if (this.set == null) { + System.out.println("Please enter a set size and values "); + System.out.println(); + return; + } + this.set = this.getValues(); + } else { + if (this.set == null || this.set[0] == 0) { + System.out.println("Please enter a set size and values before executing the algorithm."); + System.out.println(); + return; + } + this.performAlgorithm(); + } + System.out.println(); + } + + /** + * Prints out the menu of options, asks for an input, and if that input is invalid it prints an error and + * prompts the user again for the input. + * + * @precondition none + * @postcondition none + * + * @return the option selected + */ + private int getOption() { + this.displayMenu(); // Prints out the menu + + // Asks for the option and begins the loop until a valid option is gathered. + System.out.print("Enter option number: "); + int input = getIntegerInput(); + while (input < 1 || input > 4) { // Compares it to the valid options available. + System.out.println("\nPlease enter a valid input."); + System.out.print("Enter option number: "); + input = getIntegerInput(); + } + System.out.println(); + return input; + } + + /** + * Displays the menu options. + * + * @precondition none + * @postcondition the menu is displayed. + */ + private void displayMenu() { + System.out.println("-----------------MAIN MENU--------------"); + System.out.println("1. Read set size (number of integers)"); + System.out.println("2. Read set elements (integer values)"); + System.out.println("3. Run algorithm and display outputs"); + System.out.println("4. Exit program"); + System.out.println(); + } + + /** + * Gets user input to a number. A prompt must be provided prior to running this method. + * If the input was not an integer/(unable to be autoboxed), returns -1. + * + * @precondition none + * @postcondition none + * + * @return the integer input, if invalid -1. + */ + private int getIntegerInput() { + Scanner sc = new Scanner(System.in); + try { + String textInput = sc.nextLine(); + return Integer.parseInt(textInput); + } catch (Exception e) { + return -1; + } + } + + private int[] getValues() { + Scanner sc = new Scanner(System.in); + String input = null; + int[] values = new int[this.set.length]; + System.out.println("Please enter a list of " + this.set.length + " positive values. (Ex. 34 35 21 23)"); + while (values[0] == 0) { + System.out.print("Values: "); + input = sc.nextLine(); + String[] stringRep = input.split(" "); + + /* If the input values are not the same number as the set size */ + if (stringRep.length != values.length || input.isEmpty() ) { + System.out.println("Please enter a valid list of " + this.set.length + " positive values. (Ex. 34 35 21 23)"); + continue; + } + + /* Attempts to convert each value from String to Integer. */ + try { + for (int i = 0; i < values.length; i++) { + values[i] = Integer.parseInt(stringRep[i]); + if (values[i] < 1) { + System.out.println("Please enter a valid list of " + this.set.length + " positive values. (Ex. 34 35 21 23)"); + Arrays.fill(values, 0); + break; + } + } + } catch (Exception e) { + System.out.println("Please enter a valid list of " + this.set.length + " positive values. (Ex. 34 35 21 23)"); + } + } + + + return values; + } + /** * Iterates through all the possible subsets generated by this.generateSubsets * and if a subset is found that is exactly half the size it sets the firstset @@ -92,6 +243,7 @@ public class Partition { * Checks through every subset that was generated, * if a subset is found it sets the firstSubset to the found subset. */ + generateSubsets(); for (List subset : subsets) { int subsetTotal = 0; for (int value : subset) { @@ -134,12 +286,12 @@ public class Partition { String first = "{"; String second = "{"; if (firstSubset != null) { - for (int fvalues : firstSubset) { - first += fvalues + ","; + for (int fValues : firstSubset) { + first += fValues + ","; } first = first.substring(0, first.length()-1) + "}"; - for (int svalues : secondSubset) { - second += svalues + ","; + for (int sValues : secondSubset) { + second += sValues + ","; } second = second.substring(0, second.length()-1) + "}"; } else { @@ -147,7 +299,7 @@ public class Partition { second = "of their elements found"; } - System.out.println("Set size: " + setSize); + System.out.println("Set size: " + setSize + " integers"); System.out.println("Integer values: " + original); System.out.println("Disjoint subsets with same sum: " + first); System.out.println(" " + second);