Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- import java.util.ArrayList;
- import java.util.HashMap;
- import java.util.Map.Entry;
- import java.util.Scanner;
- /**
- * Firstly, read an positive integer from user. Secondly, read a list of positive
- * integers one by one from user. Finally, find all pairs of numbers in the list
- * that their sum is equal to the first number.
- *
- * When user input numbers, the program will keep asking user to input until get a
- * valid integer.
- *
- * Instruction to run the code:
- * 1. Compile the code use following command: javac PairFinder.java
- * 2. Run complied use following command: java PairFinder
- *
- * Java version: 1.8
- *
- * @author tzha0024@student.monash.edu
- *
- */
- public class PairFinder {
- private static int firstNumber; // User input first number
- private static ArrayList<Integer> theList; // User input a list of numbers
- private static HashMap<Integer, Integer> pairs; // Pairs found
- private static Scanner sc; // User input reader
- /**
- * Main method.
- *
- * @param args
- */
- public static void main(String[] args) {
- sc = new Scanner(System.in);
- readFirstNumber();
- readTheList();
- findPairs();
- sc.close();
- }
- /**
- * Read an positive integer number from user. The program will keep asking
- * user to input until get a valid integer.
- */
- private static void readFirstNumber() {
- boolean flag = true;
- while (flag)
- {
- System.out.println("Please input a positive integer: ");
- String numberStr = sc.nextLine();
- if (isValidNumber(numberStr))
- {
- int tempNum = Integer.parseInt(numberStr);
- if (tempNum > 0) {
- firstNumber = tempNum;
- flag = false;
- }
- else
- {
- System.out.println("[ERROR] Your input is not a positive integer!");
- }
- }
- }
- }
- /**
- * Read a list of positive integer numbers one by one from user. The program will
- * keep asking user to add numbers to the list. When user input '0', the program
- * will stop asking and the list is complete.
- */
- private static void readTheList() {
- theList = new ArrayList<Integer>();
- System.out.println("Please input add numbers to the list one by one. Input '0' to finish the list.");
- boolean flag = true;
- while (flag) {
- // Show user the current numbers of the list
- printList();
- System.out.println("Please add your next positive integer to the list. Input '0' to finish the list. ");
- String numberStr = sc.nextLine();
- if (isValidNumber(numberStr))
- {
- int tempNum = Integer.parseInt(numberStr);
- if (tempNum > 0) {
- theList.add(tempNum);
- }
- else
- {
- // User input 0, stop the loop
- flag = false;
- }
- }
- }
- }
- /**
- * Find all pairs of numbers in the list that their sum is equal to
- * the first number.
- * 1. Duplicates such as [4,4] are not considered.
- * 2. Same numbers in different order such as [4,8] and [8,4] will
- * be consider as a single pair.
- *
- * The algorithm is nested loop. Outer loop find a number1 which is
- * less than the firstNumber and not equals to the half of firstNumber.
- * Then, inner loop iterate from the next index of outer loop to the end of
- * the list to find number2 which satisfy: number1 + number2 = firstNumber.
- */
- private static void findPairs() {
- pairs = new HashMap<Integer, Integer>();
- int listSize = theList.size();
- // iterate the list
- for (int i = 0; i < listSize - 1; i++)
- {
- int number1 = theList.get(i);
- // check the number less than firstNumber and not duplicates
- if (number1 < firstNumber && number1 != (firstNumber - number1))
- {
- // iterate the rest of the list
- for (int j = i; j < listSize; j++)
- {
- int number2 = theList.get(j);
- // Check if number1 + number2 = firstNumber
- if (number2 == (firstNumber - number1))
- {
- // Check duplicates
- if (!pairs.containsKey(number2) && !pairs.containsValue(number2))
- {
- pairs.put(number1, number2);
- }
- }
- }
- }
- }
- // print the pairs
- System.out.println("=============================");
- System.out.println("First number: " + firstNumber);
- printList();
- System.out.println("All pairs of numbers are: ");
- for (Entry<Integer, Integer> e : pairs.entrySet())
- {
- System.out.println("[" + e.getKey() + "," + e.getValue() + "]");
- }
- }
- /**
- * Show the current numbers of the list.
- */
- private static void printList() {
- System.out.print("Current list: [ ");
- if (theList.size() > 0) {
- for(Integer i : theList)
- {
- System.out.print(i + " ");
- }
- }
- System.out.print("]");
- System.out.println();
- }
- /**
- * Check whether user's input string is a valid integer or not.
- * @param numberStr User's input string
- * @return True if user's input string is a valid integer
- */
- private static boolean isValidNumber(String numberStr) {
- boolean flag = false;
- if (numberStr.trim().length() > 0)
- {
- if (numberStr.length() < 10)
- {
- flag = true;
- for (int i = 0; i < numberStr.length(); i++)
- {
- char c = numberStr.charAt(i);
- if (c < '0' || c > '9')
- {
- flag = false;
- System.out.println("[ERROR] Your input is not a valid integer!");
- break;
- }
- }
- }
- else
- {
- System.out.println("[ERROR] Please only input within 10 digits.");
- }
- }
- else
- {
- System.out.println("[ERROR] Please do not input empty space.");
- }
- return flag;
- }
- }
Add Comment
Please, Sign In to add comment