From e1c4a56fab00fa08280295eb9b1b46a1a155ca42 Mon Sep 17 00:00:00 2001 From: Vasily Dubinin Date: Wed, 1 Sep 2021 18:16:51 +0300 Subject: [PATCH 01/13] Setup --- src/main/java/com/h2/App.java | 19 ++++++++++++------- 1 file changed, 12 insertions(+), 7 deletions(-) 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; } } From 7129b9acac785d8f3645c1f7f53e337e004481ce Mon Sep 17 00:00:00 2001 From: Vasily Dubinin Date: Wed, 1 Sep 2021 18:17:33 +0300 Subject: [PATCH 02/13] Bumped junit version in pom --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) 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 From 76a73afeff2e7b3c8ccffcb243ac4917a253b08e Mon Sep 17 00:00:00 2001 From: Vasily Dubinin Date: Wed, 1 Sep 2021 19:04:49 +0300 Subject: [PATCH 03/13] Finding the best loan rates --- src/main/java/com/h2/BestLoanRates.java | 29 +++++++++++++++++++++++++ 1 file changed, 29 insertions(+) create mode 100644 src/main/java/com/h2/BestLoanRates.java diff --git a/src/main/java/com/h2/BestLoanRates.java b/src/main/java/com/h2/BestLoanRates.java new file mode 100644 index 00000000..1e03f12d --- /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.00000001f; + + 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 load 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); + } else { + System.out.println("Best Available Rate: " + getRates(loanTermInYears) + "%"); + } + scanner.close(); + } + + public static float getRates(int loanTermInYears) { + return bestRates.getOrDefault(loanTermInYears, 0.0f); + } +} From cc934ff08755d6e2f77894e080033715372e6b3d Mon Sep 17 00:00:00 2001 From: Vasily Dubinin Date: Wed, 1 Sep 2021 19:04:49 +0300 Subject: [PATCH 04/13] Finding the best loan rates --- src/main/java/com/h2/BestLoanRates.java | 29 +++++++++++++++++++++++++ 1 file changed, 29 insertions(+) create mode 100644 src/main/java/com/h2/BestLoanRates.java diff --git a/src/main/java/com/h2/BestLoanRates.java b/src/main/java/com/h2/BestLoanRates.java new file mode 100644 index 00000000..89e905d1 --- /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.00000001f; + + 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); + } else { + System.out.println("Best Available Rate: " + getRates(loanTermInYears) + "%"); + } + scanner.close(); + } + + public static float getRates(int loanTermInYears) { + return bestRates.getOrDefault(loanTermInYears, 0.0f); + } +} From e02942eea5a6fb084c84f47794ca40c0ee7fb51e Mon Sep 17 00:00:00 2001 From: Vasily Dubinin Date: Wed, 1 Sep 2021 19:14:45 +0300 Subject: [PATCH 05/13] Fixed typos --- src/main/java/com/h2/BestLoanRates.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/com/h2/BestLoanRates.java b/src/main/java/com/h2/BestLoanRates.java index 89e905d1..124d6460 100644 --- a/src/main/java/com/h2/BestLoanRates.java +++ b/src/main/java/com/h2/BestLoanRates.java @@ -16,7 +16,7 @@ public static void main(String[] args) { int loanTermInYears = scanner.nextInt(); float bestRate = getRates(loanTermInYears); if (Math.abs(bestRate - 0.0f) < EPSILON) { - System.out.println("No available rates for term: " + loanTermInYears); + System.out.println("No available rates for term: " + loanTermInYears + "years"); } else { System.out.println("Best Available Rate: " + getRates(loanTermInYears) + "%"); } From 407f0e30a7c4932f3ce530a4c9b488bddbc788c5 Mon Sep 17 00:00:00 2001 From: Vasily Dubinin Date: Wed, 1 Sep 2021 19:14:45 +0300 Subject: [PATCH 06/13] Fixed typos --- src/main/java/com/h2/BestLoanRates.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/com/h2/BestLoanRates.java b/src/main/java/com/h2/BestLoanRates.java index 89e905d1..0c8bcdcd 100644 --- a/src/main/java/com/h2/BestLoanRates.java +++ b/src/main/java/com/h2/BestLoanRates.java @@ -16,7 +16,7 @@ public static void main(String[] args) { int loanTermInYears = scanner.nextInt(); float bestRate = getRates(loanTermInYears); if (Math.abs(bestRate - 0.0f) < EPSILON) { - System.out.println("No available rates for term: " + loanTermInYears); + System.out.println("No available rates for term: " + loanTermInYears + " years"); } else { System.out.println("Best Available Rate: " + getRates(loanTermInYears) + "%"); } From 45d83e430f6cba037f3cb845a47573c9dbf1beed Mon Sep 17 00:00:00 2001 From: Vasily Dubinin Date: Thu, 2 Sep 2021 01:36:04 +0300 Subject: [PATCH 07/13] Savings Calculator --- src/main/java/com/h2/BestLoanRates.java | 2 +- src/main/java/com/h2/SavingsCalculator.java | 61 +++++++++++++++++++++ 2 files changed, 62 insertions(+), 1 deletion(-) create mode 100644 src/main/java/com/h2/SavingsCalculator.java diff --git a/src/main/java/com/h2/BestLoanRates.java b/src/main/java/com/h2/BestLoanRates.java index 0c8bcdcd..d6e0e536 100644 --- a/src/main/java/com/h2/BestLoanRates.java +++ b/src/main/java/com/h2/BestLoanRates.java @@ -5,7 +5,7 @@ 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.00000001f; + public static final float EPSILON = 0.000_000_01f; public static void main(String[] args) { Scanner scanner = new Scanner(System.in); 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(); + } +} From 458c9b1ad665b2223ab716037c684cfbee5ba0e7 Mon Sep 17 00:00:00 2001 From: Vasily Dubinin Date: Thu, 2 Sep 2021 02:14:08 +0300 Subject: [PATCH 08/13] Mortgage Calculator --- src/main/java/com/h2/MortgageCalculator.java | 52 ++++++++++++++++++++ 1 file changed, 52 insertions(+) create mode 100644 src/main/java/com/h2/MortgageCalculator.java diff --git a/src/main/java/com/h2/MortgageCalculator.java b/src/main/java/com/h2/MortgageCalculator.java new file mode 100644 index 00000000..c50d4ee6 --- /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 = Long.parseLong(args[0]); + int termInYears = Integer.parseInt(args[1]); + float annualRate = Float.parseFloat(args[2]); + + MortgageCalculator calculator = new MortgageCalculator(loanAmount, termInYears, annualRate); + + calculator.calculateMonthlyPayment(); + + System.out.println(calculator.toString()); + + } +} From 243da7c92bb2c40645f655586c1afe460da1e33e Mon Sep 17 00:00:00 2001 From: Vasily Dubinin Date: Fri, 3 Sep 2021 19:41:23 +0300 Subject: [PATCH 09/13] Finance App --- src/main/java/Finance.java | 60 ++++++++++++++++++++++++++++++++++++++ 1 file changed, 60 insertions(+) create mode 100644 src/main/java/Finance.java diff --git a/src/main/java/Finance.java b/src/main/java/Finance.java new file mode 100644 index 00000000..179feced --- /dev/null +++ b/src/main/java/Finance.java @@ -0,0 +1,60 @@ +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"); + } + boolean isValidCommand = validateCommandArguments(args); + if(!isValidCommand) { + commandsToUsage.get(command); + return; + } + executeCommand(command, Arrays.copyOfRange(args, 1, args.length)); + } +} From 3a828a14f94ef70be9e536e53774502e908e51fa Mon Sep 17 00:00:00 2001 From: Vasily Dubinin Date: Fri, 3 Sep 2021 19:41:23 +0300 Subject: [PATCH 10/13] Finance App --- src/main/java/Finance.java | 60 ++++++++++++++++++++++++++++++++++++++ 1 file changed, 60 insertions(+) create mode 100644 src/main/java/Finance.java diff --git a/src/main/java/Finance.java b/src/main/java/Finance.java new file mode 100644 index 00000000..179feced --- /dev/null +++ b/src/main/java/Finance.java @@ -0,0 +1,60 @@ +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"); + } + boolean isValidCommand = validateCommandArguments(args); + if(!isValidCommand) { + commandsToUsage.get(command); + return; + } + executeCommand(command, Arrays.copyOfRange(args, 1, args.length)); + } +} From 0fe4a254cab4c71bdf4ba723a338136d390ced53 Mon Sep 17 00:00:00 2001 From: Vasily Dubinin Date: Fri, 3 Sep 2021 19:43:50 +0300 Subject: [PATCH 11/13] Finance App Fix --- src/main/java/Finance.java | 1 + 1 file changed, 1 insertion(+) diff --git a/src/main/java/Finance.java b/src/main/java/Finance.java index 179feced..e9e77ca1 100644 --- a/src/main/java/Finance.java +++ b/src/main/java/Finance.java @@ -49,6 +49,7 @@ 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) { From eb889d459daab13c059b2c5656b9dd510a9334c9 Mon Sep 17 00:00:00 2001 From: Vasily Dubinin Date: Fri, 3 Sep 2021 19:43:50 +0300 Subject: [PATCH 12/13] Finance App Fix --- src/main/java/Finance.java | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/src/main/java/Finance.java b/src/main/java/Finance.java index 179feced..4548723e 100644 --- a/src/main/java/Finance.java +++ b/src/main/java/Finance.java @@ -47,14 +47,17 @@ private static void executeCommand(String command, String[] arguments) { public static void main(String[] args) { String command = args[0]; - if(!commandsToUsage.containsKey(command)) { + if (!commandsToUsage.containsKey(command)) { System.out.println(command + ": command not found"); + return; } + boolean isValidCommand = validateCommandArguments(args); - if(!isValidCommand) { + if (!isValidCommand) { commandsToUsage.get(command); return; } + executeCommand(command, Arrays.copyOfRange(args, 1, args.length)); } } From f4e3a3bc9d2b59202ee2f8191de376ec7bc43401 Mon Sep 17 00:00:00 2001 From: Vasily Dubinin Date: Tue, 21 Sep 2021 00:47:46 +0300 Subject: [PATCH 13/13] Utilities --- src/main/java/com/h2/MortgageCalculator.java | 6 ++-- src/main/java/com/h2/Utilities.java | 33 ++++++++++++++++++++ 2 files changed, 36 insertions(+), 3 deletions(-) create mode 100644 src/main/java/com/h2/Utilities.java diff --git a/src/main/java/com/h2/MortgageCalculator.java b/src/main/java/com/h2/MortgageCalculator.java index c50d4ee6..fbf56768 100644 --- a/src/main/java/com/h2/MortgageCalculator.java +++ b/src/main/java/com/h2/MortgageCalculator.java @@ -38,9 +38,9 @@ public String toString() { } public static void main(String[] args) { - long loanAmount = Long.parseLong(args[0]); - int termInYears = Integer.parseInt(args[1]); - float annualRate = Float.parseFloat(args[2]); + 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); 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; + } +}