diff --git a/pom.xml b/pom.xml
index c8c1ea3b..757de0cd 100644
--- a/pom.xml
+++ b/pom.xml
@@ -15,7 +15,7 @@
UTF-8
11.0.2
11.0.2
- 5.6.2
+ 5.7.2
diff --git a/src/main/java/Finance.java b/src/main/java/Finance.java
new file mode 100644
index 00000000..d8bfb171
--- /dev/null
+++ b/src/main/java/Finance.java
@@ -0,0 +1,64 @@
+import com.h2.BestLoanRates;
+import com.h2.MortgageCalculator;
+import com.h2.SavingsCalculator;
+
+import java.util.Arrays;
+import java.util.Map;
+
+public class Finance {
+ public final static String BEST_LOAN_RATES = "bestLoanRates";
+ public final static String SAVINGS_CALCULATOR = "savingsCalculator";
+ public final static String MORTGAGE_CALCULATOR = "mortgageCalculator";
+
+ public final static Map commandsToUsage = Map.of(
+ "bestLoanRates", "usage: bestLoanRates",
+ "savingsCalculator", "usage: savingsCalculator ",
+ "mortgageCalculator", "usage: mortgageCalculator "
+ );
+
+ private static boolean validateCommandArguments(String[] args) {
+ switch (args[0]) {
+ case BEST_LOAN_RATES:
+ return args.length == 1;
+ case SAVINGS_CALCULATOR:
+ return args.length == 3;
+ case MORTGAGE_CALCULATOR:
+ return args.length == 4;
+ }
+ return false;
+ }
+
+ private static void executeCommand(String command, String[] arguments) {
+ switch (command) {
+ case BEST_LOAN_RATES:
+ System.out.println("Finding best loan rates ...");
+ BestLoanRates.main(arguments);
+ return;
+ case SAVINGS_CALCULATOR:
+ System.out.println("Finding your net savings ...");
+ SavingsCalculator.main(arguments);
+ return;
+ case MORTGAGE_CALCULATOR:
+ System.out.println("Finding your monthly payment ...");
+ MortgageCalculator.main(arguments);
+ return;
+ }
+ }
+
+ public static void main(String[] args) {
+ String command = args[0];
+ if (!commandsToUsage.containsKey(command)) {
+ System.out.println(command + ": command not found");
+ return;
+ }
+
+ boolean isValidCommand = validateCommandArguments(args);
+ if (!isValidCommand) {
+ commandsToUsage.get(command);
+ System.out.println(commandsToUsage.get(args[0]));
+ return;
+ }
+
+ executeCommand(command, Arrays.copyOfRange(args, 1, args.length));
+ }
+}
diff --git a/src/main/java/com/h2/App.java b/src/main/java/com/h2/App.java
index 011ff16b..710ca77a 100644
--- a/src/main/java/com/h2/App.java
+++ b/src/main/java/com/h2/App.java
@@ -2,16 +2,21 @@
/**
* Hello world!
- *
*/
-public class App
-{
- public static void main( String[] args )
- {
- System.out.println( "Hello World!" );
+public class App {
+ public static void main(String[] args) {
+ System.out.println("Hello World!");
}
public static int doubleTheNumber(int number) {
- return -1;
+ return number * 2;
+ }
+
+ private static int add(int[] numbers) {
+ int sum = 0;
+ for (int number : numbers) {
+ sum += number;
+ }
+ return sum;
}
}
diff --git a/src/main/java/com/h2/BestLoanRates.java b/src/main/java/com/h2/BestLoanRates.java
new file mode 100644
index 00000000..d6e0e536
--- /dev/null
+++ b/src/main/java/com/h2/BestLoanRates.java
@@ -0,0 +1,29 @@
+package com.h2;
+
+import java.util.Map;
+import java.util.Scanner;
+
+public class BestLoanRates {
+ public static final Map bestRates = Map.of(1, 5.50f, 2, 3.45f, 3, 2.67f);
+ public static final float EPSILON = 0.000_000_01f;
+
+ public static void main(String[] args) {
+ Scanner scanner = new Scanner(System.in);
+ System.out.println("Enter your name");
+ String name = scanner.nextLine();
+ System.out.println("Hello " + name);
+ System.out.println("Enter the loan term (in years)");
+ int loanTermInYears = scanner.nextInt();
+ float bestRate = getRates(loanTermInYears);
+ if (Math.abs(bestRate - 0.0f) < EPSILON) {
+ System.out.println("No available rates for term: " + loanTermInYears + " years");
+ } else {
+ System.out.println("Best Available Rate: " + getRates(loanTermInYears) + "%");
+ }
+ scanner.close();
+ }
+
+ public static float getRates(int loanTermInYears) {
+ return bestRates.getOrDefault(loanTermInYears, 0.0f);
+ }
+}
diff --git a/src/main/java/com/h2/MortgageCalculator.java b/src/main/java/com/h2/MortgageCalculator.java
new file mode 100644
index 00000000..fbf56768
--- /dev/null
+++ b/src/main/java/com/h2/MortgageCalculator.java
@@ -0,0 +1,52 @@
+package com.h2;
+
+import java.text.DecimalFormat;
+
+public class MortgageCalculator {
+ private long loanAmount;
+ private int termInYears;
+ private float annualRate;
+ private double monthlyPayment;
+
+ public MortgageCalculator(long loanAmount, int termInYears, float annualRate) {
+ this.loanAmount = loanAmount;
+ this.termInYears = termInYears;
+ this.annualRate = annualRate;
+ }
+
+ private int getNumberOfPayments(){
+ return termInYears * 12;
+ }
+
+ private float getMonthlyInterestRate() {
+ float interestRate = annualRate / 100;
+ return interestRate / 12;
+ }
+
+ public void calculateMonthlyPayment() {
+ long P = loanAmount;
+ float r = getMonthlyInterestRate();
+ int n = getNumberOfPayments();
+ double M = P * (((r * Math.pow(1 + r, n))) / ((Math.pow((1 + r), n)) - 1));
+ this.monthlyPayment = M;
+ }
+
+ @Override
+ public String toString() {
+ DecimalFormat df = new DecimalFormat("####0.00");
+ return "monthlyPayment: " + df.format(monthlyPayment);
+ }
+
+ public static void main(String[] args) {
+ long loanAmount = Utilities.getLongValue(args[0]);
+ int termInYears = Utilities.getIntValue(args[1]);
+ float annualRate = Utilities.getFloatValue(args[2]);
+
+ MortgageCalculator calculator = new MortgageCalculator(loanAmount, termInYears, annualRate);
+
+ calculator.calculateMonthlyPayment();
+
+ System.out.println(calculator.toString());
+
+ }
+}
diff --git a/src/main/java/com/h2/SavingsCalculator.java b/src/main/java/com/h2/SavingsCalculator.java
new file mode 100644
index 00000000..5980c8dc
--- /dev/null
+++ b/src/main/java/com/h2/SavingsCalculator.java
@@ -0,0 +1,61 @@
+package com.h2;
+
+import java.time.LocalDate;
+import java.time.YearMonth;
+
+public class SavingsCalculator {
+ private final float[] credits, debits;
+
+ public SavingsCalculator(float[] credits, float[] debits) {
+ this.credits = credits;
+ this.debits = debits;
+ }
+
+ public static void main(String[] args) {
+ String[] creditsAsString = args[0].split(",");
+ String[] debitsAsString = args[1].split(",");
+ float[] credits = new float[creditsAsString.length];
+ for (int i = 0; i < creditsAsString.length; i++) {
+ credits[i] = Float.parseFloat(creditsAsString[i]);
+ }
+ float[] debits = new float[debitsAsString.length];
+ for (int i = 0; i < debitsAsString.length; i++) {
+ debits[i] = Float.parseFloat(debitsAsString[i]);
+ }
+
+ SavingsCalculator calculator = new SavingsCalculator(credits, debits);
+
+ float netSavings = calculator.calculate();
+ System.out.println("Net Savings = "
+ + netSavings
+ + ", remaining days in month = "
+ + remainingDaysInMonth(LocalDate.now()));
+ }
+
+ private static int remainingDaysInMonth(LocalDate date) {
+ YearMonth yearMonth = YearMonth.of(date.getYear(), date.getMonth());
+ int totalDaysInMonth = yearMonth.lengthOfMonth();
+ int remainingDays = totalDaysInMonth - date.getDayOfMonth();
+ return remainingDays;
+ }
+
+ private float sumOfCredits() {
+ float sum = 0.0f;
+ for (float credit : credits) {
+ sum += credit;
+ }
+ return sum;
+ }
+
+ private float sumOfDebits() {
+ float sum = 0.0f;
+ for (float debit : debits) {
+ sum += debit;
+ }
+ return sum;
+ }
+
+ public float calculate() {
+ return sumOfCredits() - sumOfDebits();
+ }
+}
diff --git a/src/main/java/com/h2/Utilities.java b/src/main/java/com/h2/Utilities.java
new file mode 100644
index 00000000..39a56bd3
--- /dev/null
+++ b/src/main/java/com/h2/Utilities.java
@@ -0,0 +1,33 @@
+package com.h2;
+
+public class Utilities {
+ public static long getLongValue(String in) {
+ long out = Long.MIN_VALUE;
+ try {
+ out = Long.parseLong(in);
+ } catch (NumberFormatException e) {
+ throw new IllegalArgumentException(in + " cannot be converted into a 'long' value. Exiting program.");
+ }
+ return out;
+ }
+
+ public static int getIntValue(String in) {
+ int out = Integer.MIN_VALUE;
+ try {
+ out = Integer.parseInt(in);
+ } catch (NumberFormatException e) {
+ throw new IllegalArgumentException(in + " cannot be converted into a 'int' value. Exiting program.");
+ }
+ return out;
+ }
+
+ public static float getFloatValue(String in) {
+ float out = Float.MIN_VALUE;
+ try {
+ out = Float.parseFloat(in);
+ } catch (NumberFormatException e) {
+ throw new IllegalArgumentException(in + " cannot be converted into a 'float' value. Exiting program.");
+ }
+ return out;
+ }
+}