From 51071bbd080deb06344b68721d353278904db628 Mon Sep 17 00:00:00 2001 From: Gonzalo Diaz Date: Wed, 14 Oct 2026 13:11:44 -0300 Subject: [PATCH 1/5] fix: Sonarcloud warning Use String.valueOf() instead of String.format(). "String.format()" should not be used when simpler alternatives exist java:S9397 --- .../src/main/java/ae/projecteuler/Problem0005.java | 2 +- .../src/main/java/ae/projecteuler/Problem0018.java | 6 +++--- .../java/ae/projecteuler/helper/NumberToWord.java | 11 ++++------- 3 files changed, 8 insertions(+), 11 deletions(-) diff --git a/algorithm-exercises-java/src/main/java/ae/projecteuler/Problem0005.java b/algorithm-exercises-java/src/main/java/ae/projecteuler/Problem0005.java index a05d5443..bbe27559 100644 --- a/algorithm-exercises-java/src/main/java/ae/projecteuler/Problem0005.java +++ b/algorithm-exercises-java/src/main/java/ae/projecteuler/Problem0005.java @@ -64,7 +64,7 @@ public static Integer problem0005(Integer bottom, Integer top) { minimumPrimeFactorsCollector = mixOccurrences(minimumPrimeFactorsCollector, primeFactorsCount); - log = String.format("%s", minimumPrimeFactorsCollector.toString()); + log = String.valueOf(minimumPrimeFactorsCollector); Log.info(log); } diff --git a/algorithm-exercises-java/src/main/java/ae/projecteuler/Problem0018.java b/algorithm-exercises-java/src/main/java/ae/projecteuler/Problem0018.java index 4f90e45b..47c53ab3 100644 --- a/algorithm-exercises-java/src/main/java/ae/projecteuler/Problem0018.java +++ b/algorithm-exercises-java/src/main/java/ae/projecteuler/Problem0018.java @@ -22,16 +22,16 @@ public static Integer problem0018(Integer[][] triangle) { BinaryNode tree = builder.buildBinaryNodeTreeWithWeight(triangle); Integer[] leaves = builder.getLeaves(); - log = String.format("Triangle: %s", tree); + log = "Triangle: " + tree; Log.debug(log); - log = String.format("Leaves count: %d, %s", leaves.length, leaves); + log = "Leaves count: " + leaves.length + ", " + Arrays.toString(leaves); Log.debug(log); Arrays.sort(leaves); Integer result = leaves[leaves.length - 1]; // maximum is last element - log = String.format("Problem 00018 solved: %d", result); + log = "Problem 00018 solved: " + result; Log.debug(log); return result; diff --git a/algorithm-exercises-java/src/main/java/ae/projecteuler/helper/NumberToWord.java b/algorithm-exercises-java/src/main/java/ae/projecteuler/helper/NumberToWord.java index 5318c0d3..9eddf642 100644 --- a/algorithm-exercises-java/src/main/java/ae/projecteuler/helper/NumberToWord.java +++ b/algorithm-exercises-java/src/main/java/ae/projecteuler/helper/NumberToWord.java @@ -69,8 +69,7 @@ public static String numberToWord(int value) throws Exception { return dictionary.get(Integer.toString(dec)); } - return String.format( - "%s-%s", dictionary.get(Integer.toString(dec)), dictionary.get(Integer.toString(unit))); + return dictionary.get(Integer.toString(dec)) + "-" + dictionary.get(Integer.toString(unit)); } else if (value <= 999) { // 100 to 999 @@ -78,17 +77,15 @@ public static String numberToWord(int value) throws Exception { int cent = (int) Math.floor((double) value / 100); if (rest == 0) { - return String.format("%s %s", dictionary.get(Integer.toString(cent)), NumberToWord.CENTS); + return dictionary.get(Integer.toString(cent)) + " " + NumberToWord.CENTS; } - return String.format( - "%s %s and %s", - dictionary.get(Integer.toString(cent)), NumberToWord.CENTS, numberToWord(rest)); + return dictionary.get(Integer.toString(cent)) + " " + NumberToWord.CENTS + " and " + numberToWord(rest); } else if (value == 1000) { // up to 1000 int mills = (int) Math.floor((double) value / 1000); - return String.format("%s %s", dictionary.get(Integer.toString(mills)), NumberToWord.MILLS); + return dictionary.get(Integer.toString(mills)) + " " + NumberToWord.MILLS; } throw new IllegalArgumentException("Invalid value"); From 53a68593f55416c75e4a0ae312d0944deeb9b282 Mon Sep 17 00:00:00 2001 From: Gonzalo Diaz Date: Wed, 14 Oct 2026 13:25:16 -0300 Subject: [PATCH 2/5] fix: Sonarcloud warning Extract this regular expression to a Pattern compiled outside the loop. Prepared Statements should not be created inside loops java:S9142 --- .../dictionaries_and_hashmaps/SherlockAndAnagrams.java | 8 +++++++- .../src/main/java/ae/projecteuler/Problem0017.java | 9 ++++++++- 2 files changed, 15 insertions(+), 2 deletions(-) diff --git a/algorithm-exercises-java/src/main/java/ae/hackerrank/interview_preparation_kit/dictionaries_and_hashmaps/SherlockAndAnagrams.java b/algorithm-exercises-java/src/main/java/ae/hackerrank/interview_preparation_kit/dictionaries_and_hashmaps/SherlockAndAnagrams.java index f09ab1e2..9a482201 100644 --- a/algorithm-exercises-java/src/main/java/ae/hackerrank/interview_preparation_kit/dictionaries_and_hashmaps/SherlockAndAnagrams.java +++ b/algorithm-exercises-java/src/main/java/ae/hackerrank/interview_preparation_kit/dictionaries_and_hashmaps/SherlockAndAnagrams.java @@ -6,6 +6,7 @@ import java.util.HashMap; import java.util.List; import java.util.Map; +import java.util.regex.Pattern; import java.util.stream.Collectors; /** @@ -19,6 +20,9 @@ public class SherlockAndAnagrams { private SherlockAndAnagrams() {} + private static final Pattern EMPTY_REGEX = + Pattern.compile(""); + /** factorial(). */ public static BigInteger factorial(int number) { BigInteger result = BigInteger.ONE; @@ -42,7 +46,9 @@ public static int sherlockAndAnagrams(String sWord) { // Add substrings to a candidate list. // two strings are anagrams if sorted strings are the same. String anagramCandidate = - Arrays.stream(substr.split("")).sorted().collect(Collectors.joining()); + Arrays.stream(EMPTY_REGEX.split(substr)) + .sorted() + .collect(Collectors.joining()); // Append candidates to dictionary by "sorted string" key if (candidates.containsKey(anagramCandidate)) { diff --git a/algorithm-exercises-java/src/main/java/ae/projecteuler/Problem0017.java b/algorithm-exercises-java/src/main/java/ae/projecteuler/Problem0017.java index 0b0f6511..48e85954 100644 --- a/algorithm-exercises-java/src/main/java/ae/projecteuler/Problem0017.java +++ b/algorithm-exercises-java/src/main/java/ae/projecteuler/Problem0017.java @@ -1,5 +1,7 @@ package ae.projecteuler; +import java.util.regex.Pattern; + import ae.projecteuler.helper.NumberToWord; import util.Log; @@ -12,6 +14,9 @@ public class Problem0017 { private Problem0017() {} + private static final Pattern NON_ALPHANUMERIC = + Pattern.compile("[^A-Za-z0-9]"); + /** Problem 0017. */ public static Integer problem0017(int init, int last) throws Exception { @@ -21,7 +26,9 @@ public static Integer problem0017(int init, int last) throws Exception { for (int i = init; i <= last; i++) { String word = NumberToWord.numberToWord(i); - String replaced = word.replaceAll("[^A-Za-z0-9]", ""); + String replaced = NON_ALPHANUMERIC + .matcher(word) + .replaceAll(""); acum += replaced.length(); From 1d20765aed10566cc08584a388e688a0e1bdfbc6 Mon Sep 17 00:00:00 2001 From: Gonzalo Diaz Date: Wed, 14 Oct 2026 13:32:54 -0300 Subject: [PATCH 3/5] fix: Sonarcloud warning Use a stream instead of this loop. Loops should use Stream API when performing filter, map, or collect operations java:S9391 --- .../dictionaries_and_hashmaps/TwoStrings.java | 20 +++++++------------ 1 file changed, 7 insertions(+), 13 deletions(-) diff --git a/algorithm-exercises-java/src/main/java/ae/hackerrank/interview_preparation_kit/dictionaries_and_hashmaps/TwoStrings.java b/algorithm-exercises-java/src/main/java/ae/hackerrank/interview_preparation_kit/dictionaries_and_hashmaps/TwoStrings.java index 02e7c691..145e19fd 100644 --- a/algorithm-exercises-java/src/main/java/ae/hackerrank/interview_preparation_kit/dictionaries_and_hashmaps/TwoStrings.java +++ b/algorithm-exercises-java/src/main/java/ae/hackerrank/interview_preparation_kit/dictionaries_and_hashmaps/TwoStrings.java @@ -1,7 +1,7 @@ package ae.hackerrank.interview_preparation_kit.dictionaries_and_hashmaps; -import java.util.HashSet; import java.util.Set; +import java.util.stream.Collectors; /** * TwoStrings. @@ -20,19 +20,13 @@ private TwoStrings() {} /** twoStringsCompute. */ public static boolean twoStringsCompute(String s1, String s2) { - Set dictionary = new HashSet<>(); + Set dictionary = s1.chars() + .mapToObj(c -> String.valueOf((char) c)) + .collect(Collectors.toSet()); - for (char occurrence : s1.toCharArray()) { - dictionary.add("%c".formatted(occurrence)); - } - - for (char occurrence : s2.toCharArray()) { - if (dictionary.contains("%c".formatted(occurrence))) { - return true; - } - } - - return false; + return s2.chars() + .mapToObj(c -> String.valueOf((char) c)) + .anyMatch(dictionary::contains); } public static String twoStrings(String s1, String s2) { From 65b7a121c326be3c49c656c7e5365e72edcd3d59 Mon Sep 17 00:00:00 2001 From: Gonzalo Diaz Date: Wed, 14 Oct 2026 13:39:30 -0300 Subject: [PATCH 4/5] fix: Sonarcloud warning Exception added due code is designed to work in java below 21 --- .../dictionaries_and_hashmaps/RansomNote.java | 1 + 1 file changed, 1 insertion(+) diff --git a/algorithm-exercises-java/src/main/java/ae/hackerrank/interview_preparation_kit/dictionaries_and_hashmaps/RansomNote.java b/algorithm-exercises-java/src/main/java/ae/hackerrank/interview_preparation_kit/dictionaries_and_hashmaps/RansomNote.java index c5b8b1cc..2432d307 100644 --- a/algorithm-exercises-java/src/main/java/ae/hackerrank/interview_preparation_kit/dictionaries_and_hashmaps/RansomNote.java +++ b/algorithm-exercises-java/src/main/java/ae/hackerrank/interview_preparation_kit/dictionaries_and_hashmaps/RansomNote.java @@ -26,6 +26,7 @@ protected RansomNote() {} private static final String NO = "No"; /** checkMagazineCompute. */ + @SuppressWarnings("java:S7467") public static boolean checkMagazineCompute(List magazine, List note) { Map dictionary = new HashMap<>(); From 5e246673f7371dfe8301bf7f2b4ddb21bb4a8a38 Mon Sep 17 00:00:00 2001 From: Gonzalo Diaz Date: Wed, 14 Oct 2026 13:48:32 -0300 Subject: [PATCH 5/5] fix: formatted source files --- .../dictionaries_and_hashmaps/SherlockAndAnagrams.java | 7 ++----- .../dictionaries_and_hashmaps/TwoStrings.java | 9 +++------ .../src/main/java/ae/projecteuler/Problem0017.java | 10 +++------- .../main/java/ae/projecteuler/helper/NumberToWord.java | 6 +++++- 4 files changed, 13 insertions(+), 19 deletions(-) diff --git a/algorithm-exercises-java/src/main/java/ae/hackerrank/interview_preparation_kit/dictionaries_and_hashmaps/SherlockAndAnagrams.java b/algorithm-exercises-java/src/main/java/ae/hackerrank/interview_preparation_kit/dictionaries_and_hashmaps/SherlockAndAnagrams.java index 9a482201..9933b64d 100644 --- a/algorithm-exercises-java/src/main/java/ae/hackerrank/interview_preparation_kit/dictionaries_and_hashmaps/SherlockAndAnagrams.java +++ b/algorithm-exercises-java/src/main/java/ae/hackerrank/interview_preparation_kit/dictionaries_and_hashmaps/SherlockAndAnagrams.java @@ -20,8 +20,7 @@ public class SherlockAndAnagrams { private SherlockAndAnagrams() {} - private static final Pattern EMPTY_REGEX = - Pattern.compile(""); + private static final Pattern EMPTY_REGEX = Pattern.compile(""); /** factorial(). */ public static BigInteger factorial(int number) { @@ -46,9 +45,7 @@ public static int sherlockAndAnagrams(String sWord) { // Add substrings to a candidate list. // two strings are anagrams if sorted strings are the same. String anagramCandidate = - Arrays.stream(EMPTY_REGEX.split(substr)) - .sorted() - .collect(Collectors.joining()); + Arrays.stream(EMPTY_REGEX.split(substr)).sorted().collect(Collectors.joining()); // Append candidates to dictionary by "sorted string" key if (candidates.containsKey(anagramCandidate)) { diff --git a/algorithm-exercises-java/src/main/java/ae/hackerrank/interview_preparation_kit/dictionaries_and_hashmaps/TwoStrings.java b/algorithm-exercises-java/src/main/java/ae/hackerrank/interview_preparation_kit/dictionaries_and_hashmaps/TwoStrings.java index 145e19fd..6a6477c2 100644 --- a/algorithm-exercises-java/src/main/java/ae/hackerrank/interview_preparation_kit/dictionaries_and_hashmaps/TwoStrings.java +++ b/algorithm-exercises-java/src/main/java/ae/hackerrank/interview_preparation_kit/dictionaries_and_hashmaps/TwoStrings.java @@ -20,13 +20,10 @@ private TwoStrings() {} /** twoStringsCompute. */ public static boolean twoStringsCompute(String s1, String s2) { - Set dictionary = s1.chars() - .mapToObj(c -> String.valueOf((char) c)) - .collect(Collectors.toSet()); + Set dictionary = + s1.chars().mapToObj(c -> String.valueOf((char) c)).collect(Collectors.toSet()); - return s2.chars() - .mapToObj(c -> String.valueOf((char) c)) - .anyMatch(dictionary::contains); + return s2.chars().mapToObj(c -> String.valueOf((char) c)).anyMatch(dictionary::contains); } public static String twoStrings(String s1, String s2) { diff --git a/algorithm-exercises-java/src/main/java/ae/projecteuler/Problem0017.java b/algorithm-exercises-java/src/main/java/ae/projecteuler/Problem0017.java index 48e85954..1bf3c9e0 100644 --- a/algorithm-exercises-java/src/main/java/ae/projecteuler/Problem0017.java +++ b/algorithm-exercises-java/src/main/java/ae/projecteuler/Problem0017.java @@ -1,8 +1,7 @@ package ae.projecteuler; -import java.util.regex.Pattern; - import ae.projecteuler.helper.NumberToWord; +import java.util.regex.Pattern; import util.Log; /** @@ -14,8 +13,7 @@ public class Problem0017 { private Problem0017() {} - private static final Pattern NON_ALPHANUMERIC = - Pattern.compile("[^A-Za-z0-9]"); + private static final Pattern NON_ALPHANUMERIC = Pattern.compile("[^A-Za-z0-9]"); /** Problem 0017. */ public static Integer problem0017(int init, int last) throws Exception { @@ -26,9 +24,7 @@ public static Integer problem0017(int init, int last) throws Exception { for (int i = init; i <= last; i++) { String word = NumberToWord.numberToWord(i); - String replaced = NON_ALPHANUMERIC - .matcher(word) - .replaceAll(""); + String replaced = NON_ALPHANUMERIC.matcher(word).replaceAll(""); acum += replaced.length(); diff --git a/algorithm-exercises-java/src/main/java/ae/projecteuler/helper/NumberToWord.java b/algorithm-exercises-java/src/main/java/ae/projecteuler/helper/NumberToWord.java index 9eddf642..169bb7cf 100644 --- a/algorithm-exercises-java/src/main/java/ae/projecteuler/helper/NumberToWord.java +++ b/algorithm-exercises-java/src/main/java/ae/projecteuler/helper/NumberToWord.java @@ -80,7 +80,11 @@ public static String numberToWord(int value) throws Exception { return dictionary.get(Integer.toString(cent)) + " " + NumberToWord.CENTS; } - return dictionary.get(Integer.toString(cent)) + " " + NumberToWord.CENTS + " and " + numberToWord(rest); + return dictionary.get(Integer.toString(cent)) + + " " + + NumberToWord.CENTS + + " and " + + numberToWord(rest); } else if (value == 1000) { // up to 1000 int mills = (int) Math.floor((double) value / 1000);