From f9c302b151f64dd6f0e98af8f9333bc2ceb3067e Mon Sep 17 00:00:00 2001 From: punit Date: Wed, 30 Aug 2023 11:15:18 +0530 Subject: [PATCH 1/8] Added different types of Mean --- .../java/com/thealgorithms/maths/Mean.java | 56 +++++++++++++++++ .../com/thealgorithms/maths/MeanTest.java | 62 +++++++++++++++++++ 2 files changed, 118 insertions(+) create mode 100644 src/main/java/com/thealgorithms/maths/Mean.java create mode 100644 src/test/java/com/thealgorithms/maths/MeanTest.java diff --git a/src/main/java/com/thealgorithms/maths/Mean.java b/src/main/java/com/thealgorithms/maths/Mean.java new file mode 100644 index 000000000000..da24029957b7 --- /dev/null +++ b/src/main/java/com/thealgorithms/maths/Mean.java @@ -0,0 +1,56 @@ +package com.thealgorithms.maths; + +/** + * https://en.wikipedia.org/wiki/Mean + *

+ * by: Punit Patel + */ +public class Mean { + + /** + * Arithmetic / Pythagorean Mean = (x₁ + x₂ + ... + xₙ) / n + */ + public static double arithmeticMean(double[] numbers) { + double sum = 0; + if (numbers.length == 0) { + return sum; + } + for (double num : numbers) { + sum += num; + } + + return sum / numbers.length; + } + + + /** + * Geometric Mean = (x₁ · x₂ · ... · xₙ) ^ 1/n + */ + public static double geometricMean(double[] numbers) { + double product = 1; + if (numbers.length == 0) { + return product; + } + for (double num : numbers) { + product *= num; + } + + return Math.pow(product, 1.0 / numbers.length); + } + + + /** + * Harmonic Mean = n / (1/x₁ + 1/x₂ + ... + 1/xₙ) + */ + public static double harmonicMean(double[] numbers) { + double sum = 0; + if (numbers.length == 0) { + return sum; + } + for (double num: numbers) { + sum += 1/num; + } + + return numbers.length / sum; + } +} diff --git a/src/test/java/com/thealgorithms/maths/MeanTest.java b/src/test/java/com/thealgorithms/maths/MeanTest.java new file mode 100644 index 000000000000..50d9013c48b1 --- /dev/null +++ b/src/test/java/com/thealgorithms/maths/MeanTest.java @@ -0,0 +1,62 @@ +package com.thealgorithms.maths; + +import static org.junit.jupiter.api.Assertions.*; + +import org.junit.jupiter.api.Test; + +class MeanTest { + + @Test + void arithmeticMeanZeroNumbers() { + double[] numbers = {}; + assertEquals(0, Mean.arithmeticMean(numbers)); + } + + @Test + void geometricMeanZeroNumbers() { + double[] numbers = {}; + assertEquals(1, Mean.geometricMean(numbers)); + } + + @Test + void harmonicMeanZeroNumbers() { + double[] numbers = {}; + assertEquals(0, Mean.harmonicMean(numbers)); + } + + @Test + void arithmeticMeanSingleNumber() { + double[] numbers = {2.5}; + assertEquals(2.5, Mean.arithmeticMean(numbers)); + } + + @Test + void geometricMeanSingleNumber() { + double[] numbers = {2.5}; + assertEquals(2.5, Mean.geometricMean(numbers)); + } + + @Test + void harmonicMeanSingleNumber() { + double[] numbers = {2.5}; + assertEquals(2.5, Mean.geometricMean(numbers)); + } + + @Test + void arithmeticMeanMultipleNumbers() { + double[] numbers = {1, 2.5, 83.3, 25.9999, 46.0001, 74.7, 74.5}; + assertEquals(44, Mean.arithmeticMean(numbers)); + } + + @Test + void geometricMeanMultipleNumbers() { + double[] numbers = {1, 2, 3, 4, 5, 6, 1.25}; + assertEquals(2.6426195539300585, Mean.geometricMean(numbers)); + } + + @Test + void harmonicMeanMultipleNumbers() { + double[] numbers = {1, 2.5, 83.3, 25.9999, 46.0001, 74.7, 74.5}; + assertEquals(4.6697322801074135, Mean.harmonicMean(numbers)); + } +} \ No newline at end of file From 9cf558737f8345283564c7fb277c0b87e50db159 Mon Sep 17 00:00:00 2001 From: punit Date: Wed, 30 Aug 2023 12:02:35 +0530 Subject: [PATCH 2/8] formatted files with clang-formatter --- .../java/com/thealgorithms/maths/Mean.java | 80 +++++++------ .../com/thealgorithms/maths/MeanTest.java | 106 +++++++++--------- 2 files changed, 92 insertions(+), 94 deletions(-) diff --git a/src/main/java/com/thealgorithms/maths/Mean.java b/src/main/java/com/thealgorithms/maths/Mean.java index da24029957b7..af8894a7132c 100644 --- a/src/main/java/com/thealgorithms/maths/Mean.java +++ b/src/main/java/com/thealgorithms/maths/Mean.java @@ -7,50 +7,48 @@ */ public class Mean { - /** - * Arithmetic / Pythagorean Mean = (x₁ + x₂ + ... + xₙ) / n - */ - public static double arithmeticMean(double[] numbers) { - double sum = 0; - if (numbers.length == 0) { - return sum; + /** + * Arithmetic / Pythagorean Mean = (x₁ + x₂ + ... + xₙ) / n + */ + public static double arithmeticMean(double[] numbers) { + double sum = 0; + if (numbers.length == 0) { + return sum; + } + for (double num : numbers) { + sum += num; + } + + return sum / numbers.length; } - for (double num : numbers) { - sum += num; - } - - return sum / numbers.length; - } - - /** - * Geometric Mean = (x₁ · x₂ · ... · xₙ) ^ 1/n - */ - public static double geometricMean(double[] numbers) { - double product = 1; - if (numbers.length == 0) { - return product; - } - for (double num : numbers) { - product *= num; + /** + * Geometric Mean = (x₁ · x₂ · ... · xₙ) ^ 1/n + */ + public static double geometricMean(double[] numbers) { + double product = 1; + if (numbers.length == 0) { + return product; + } + for (double num : numbers) { + product *= num; + } + + return Math.pow(product, 1.0 / numbers.length); } - return Math.pow(product, 1.0 / numbers.length); - } - - - /** - * Harmonic Mean = n / (1/x₁ + 1/x₂ + ... + 1/xₙ) - */ - public static double harmonicMean(double[] numbers) { - double sum = 0; - if (numbers.length == 0) { - return sum; + /** + * Harmonic Mean = n / (1/x₁ + 1/x₂ + ... + 1/xₙ) + */ + public static double harmonicMean(double[] numbers) { + double sum = 0; + if (numbers.length == 0) { + return sum; + } + for (double num : numbers) { + sum += 1 / num; + } + + return numbers.length / sum; } - for (double num: numbers) { - sum += 1/num; - } - - return numbers.length / sum; - } } diff --git a/src/test/java/com/thealgorithms/maths/MeanTest.java b/src/test/java/com/thealgorithms/maths/MeanTest.java index 50d9013c48b1..00aaa3bc1f11 100644 --- a/src/test/java/com/thealgorithms/maths/MeanTest.java +++ b/src/test/java/com/thealgorithms/maths/MeanTest.java @@ -6,57 +6,57 @@ class MeanTest { - @Test - void arithmeticMeanZeroNumbers() { - double[] numbers = {}; - assertEquals(0, Mean.arithmeticMean(numbers)); - } - - @Test - void geometricMeanZeroNumbers() { - double[] numbers = {}; - assertEquals(1, Mean.geometricMean(numbers)); - } - - @Test - void harmonicMeanZeroNumbers() { - double[] numbers = {}; - assertEquals(0, Mean.harmonicMean(numbers)); - } - - @Test - void arithmeticMeanSingleNumber() { - double[] numbers = {2.5}; - assertEquals(2.5, Mean.arithmeticMean(numbers)); - } - - @Test - void geometricMeanSingleNumber() { - double[] numbers = {2.5}; - assertEquals(2.5, Mean.geometricMean(numbers)); - } - - @Test - void harmonicMeanSingleNumber() { - double[] numbers = {2.5}; - assertEquals(2.5, Mean.geometricMean(numbers)); - } - - @Test - void arithmeticMeanMultipleNumbers() { - double[] numbers = {1, 2.5, 83.3, 25.9999, 46.0001, 74.7, 74.5}; - assertEquals(44, Mean.arithmeticMean(numbers)); - } - - @Test - void geometricMeanMultipleNumbers() { - double[] numbers = {1, 2, 3, 4, 5, 6, 1.25}; - assertEquals(2.6426195539300585, Mean.geometricMean(numbers)); - } - - @Test - void harmonicMeanMultipleNumbers() { - double[] numbers = {1, 2.5, 83.3, 25.9999, 46.0001, 74.7, 74.5}; - assertEquals(4.6697322801074135, Mean.harmonicMean(numbers)); - } + @Test + void arithmeticMeanZeroNumbers() { + double[] numbers = {}; + assertEquals(0, Mean.arithmeticMean(numbers)); + } + + @Test + void geometricMeanZeroNumbers() { + double[] numbers = {}; + assertEquals(1, Mean.geometricMean(numbers)); + } + + @Test + void harmonicMeanZeroNumbers() { + double[] numbers = {}; + assertEquals(0, Mean.harmonicMean(numbers)); + } + + @Test + void arithmeticMeanSingleNumber() { + double[] numbers = {2.5}; + assertEquals(2.5, Mean.arithmeticMean(numbers)); + } + + @Test + void geometricMeanSingleNumber() { + double[] numbers = {2.5}; + assertEquals(2.5, Mean.geometricMean(numbers)); + } + + @Test + void harmonicMeanSingleNumber() { + double[] numbers = {2.5}; + assertEquals(2.5, Mean.geometricMean(numbers)); + } + + @Test + void arithmeticMeanMultipleNumbers() { + double[] numbers = {1, 2.5, 83.3, 25.9999, 46.0001, 74.7, 74.5}; + assertEquals(44, Mean.arithmeticMean(numbers)); + } + + @Test + void geometricMeanMultipleNumbers() { + double[] numbers = {1, 2, 3, 4, 5, 6, 1.25}; + assertEquals(2.6426195539300585, Mean.geometricMean(numbers)); + } + + @Test + void harmonicMeanMultipleNumbers() { + double[] numbers = {1, 2.5, 83.3, 25.9999, 46.0001, 74.7, 74.5}; + assertEquals(4.6697322801074135, Mean.harmonicMean(numbers)); + } } \ No newline at end of file From 905937c9c2342f3fb69d8ab4957dd48459189005 Mon Sep 17 00:00:00 2001 From: punit Date: Thu, 31 Aug 2023 13:10:24 +0530 Subject: [PATCH 3/8] Accomodated chagnes for review comments --- .../java/com/thealgorithms/maths/Mean.java | 54 --------------- .../java/com/thealgorithms/maths/Means.java | 38 +++++++++++ .../com/thealgorithms/maths/MeanTest.java | 62 ----------------- .../com/thealgorithms/maths/MeansTest.java | 66 +++++++++++++++++++ 4 files changed, 104 insertions(+), 116 deletions(-) delete mode 100644 src/main/java/com/thealgorithms/maths/Mean.java create mode 100644 src/main/java/com/thealgorithms/maths/Means.java delete mode 100644 src/test/java/com/thealgorithms/maths/MeanTest.java create mode 100644 src/test/java/com/thealgorithms/maths/MeansTest.java diff --git a/src/main/java/com/thealgorithms/maths/Mean.java b/src/main/java/com/thealgorithms/maths/Mean.java deleted file mode 100644 index af8894a7132c..000000000000 --- a/src/main/java/com/thealgorithms/maths/Mean.java +++ /dev/null @@ -1,54 +0,0 @@ -package com.thealgorithms.maths; - -/** - * https://en.wikipedia.org/wiki/Mean - *

- * by: Punit Patel - */ -public class Mean { - - /** - * Arithmetic / Pythagorean Mean = (x₁ + x₂ + ... + xₙ) / n - */ - public static double arithmeticMean(double[] numbers) { - double sum = 0; - if (numbers.length == 0) { - return sum; - } - for (double num : numbers) { - sum += num; - } - - return sum / numbers.length; - } - - /** - * Geometric Mean = (x₁ · x₂ · ... · xₙ) ^ 1/n - */ - public static double geometricMean(double[] numbers) { - double product = 1; - if (numbers.length == 0) { - return product; - } - for (double num : numbers) { - product *= num; - } - - return Math.pow(product, 1.0 / numbers.length); - } - - /** - * Harmonic Mean = n / (1/x₁ + 1/x₂ + ... + 1/xₙ) - */ - public static double harmonicMean(double[] numbers) { - double sum = 0; - if (numbers.length == 0) { - return sum; - } - for (double num : numbers) { - sum += 1 / num; - } - - return numbers.length / sum; - } -} diff --git a/src/main/java/com/thealgorithms/maths/Means.java b/src/main/java/com/thealgorithms/maths/Means.java new file mode 100644 index 000000000000..6ad7c059cec5 --- /dev/null +++ b/src/main/java/com/thealgorithms/maths/Means.java @@ -0,0 +1,38 @@ +package com.thealgorithms.maths; + +import java.util.List; + +/** + * https://en.wikipedia.org/wiki/Mean + *

+ * by: Punit Patel + */ +public final class Means { + + /** + * Arithmetic / Pythagorean Mean = (x₁ + x₂ + ... + xₙ) / n + */ + public static Double arithmetic(final List numbers) { + if (numbers.isEmpty()) throw new IllegalArgumentException("Emtpy list given for Mean computation."); + + return numbers.stream().reduce((x, y) -> x + y).get() / numbers.size(); + } + + /** + * Geometric Mean = (x₁ · x₂ · ... · xₙ) ^ 1/n + */ + public static Double geometric(final List numbers) { + if (numbers.isEmpty()) throw new IllegalArgumentException("Emtpy list given for Mean computation."); + + return Math.pow(numbers.stream().reduce((x, y) -> x * y).get(), 1.0 / numbers.size()); + } + + /** + * Harmonic Mean = n / (1/x₁ + 1/x₂ + ... + 1/xₙ) + */ + public static double harmonic(final List numbers) { + if (numbers.isEmpty()) throw new IllegalArgumentException("Emtpy list given for Mean computation."); + + return numbers.size() / numbers.stream().map(x -> 1 / x).reduce((x, y) -> x + y).get(); + } +} diff --git a/src/test/java/com/thealgorithms/maths/MeanTest.java b/src/test/java/com/thealgorithms/maths/MeanTest.java deleted file mode 100644 index 00aaa3bc1f11..000000000000 --- a/src/test/java/com/thealgorithms/maths/MeanTest.java +++ /dev/null @@ -1,62 +0,0 @@ -package com.thealgorithms.maths; - -import static org.junit.jupiter.api.Assertions.*; - -import org.junit.jupiter.api.Test; - -class MeanTest { - - @Test - void arithmeticMeanZeroNumbers() { - double[] numbers = {}; - assertEquals(0, Mean.arithmeticMean(numbers)); - } - - @Test - void geometricMeanZeroNumbers() { - double[] numbers = {}; - assertEquals(1, Mean.geometricMean(numbers)); - } - - @Test - void harmonicMeanZeroNumbers() { - double[] numbers = {}; - assertEquals(0, Mean.harmonicMean(numbers)); - } - - @Test - void arithmeticMeanSingleNumber() { - double[] numbers = {2.5}; - assertEquals(2.5, Mean.arithmeticMean(numbers)); - } - - @Test - void geometricMeanSingleNumber() { - double[] numbers = {2.5}; - assertEquals(2.5, Mean.geometricMean(numbers)); - } - - @Test - void harmonicMeanSingleNumber() { - double[] numbers = {2.5}; - assertEquals(2.5, Mean.geometricMean(numbers)); - } - - @Test - void arithmeticMeanMultipleNumbers() { - double[] numbers = {1, 2.5, 83.3, 25.9999, 46.0001, 74.7, 74.5}; - assertEquals(44, Mean.arithmeticMean(numbers)); - } - - @Test - void geometricMeanMultipleNumbers() { - double[] numbers = {1, 2, 3, 4, 5, 6, 1.25}; - assertEquals(2.6426195539300585, Mean.geometricMean(numbers)); - } - - @Test - void harmonicMeanMultipleNumbers() { - double[] numbers = {1, 2.5, 83.3, 25.9999, 46.0001, 74.7, 74.5}; - assertEquals(4.6697322801074135, Mean.harmonicMean(numbers)); - } -} \ No newline at end of file diff --git a/src/test/java/com/thealgorithms/maths/MeansTest.java b/src/test/java/com/thealgorithms/maths/MeansTest.java new file mode 100644 index 000000000000..9e7b5ee94c06 --- /dev/null +++ b/src/test/java/com/thealgorithms/maths/MeansTest.java @@ -0,0 +1,66 @@ +package com.thealgorithms.maths; + +import static org.junit.jupiter.api.Assertions.*; + +import java.util.ArrayList; +import java.util.List; +import org.assertj.core.util.Lists; +import org.junit.jupiter.api.Test; + +class MeansTest { + + @Test + void arithmeticMeanZeroNumbers() throws IllegalArgumentException { + List numbers = new ArrayList<>(); + assertThrows(IllegalArgumentException.class, () -> Means.arithmetic(numbers)); + } + + @Test + void geometricMeanZeroNumbers() throws IllegalArgumentException { + List numbers = new ArrayList<>(); + assertThrows(IllegalArgumentException.class, () -> Means.geometric(numbers)); + } + + @Test + void harmonicMeanZeroNumbers() throws IllegalArgumentException { + List numbers = new ArrayList<>(); + assertThrows(IllegalArgumentException.class, () -> Means.harmonic(numbers)); + } + + @Test + void arithmeticMeanSingleNumber() { + List numbers = Lists.newArrayList(2.5); + assertEquals(2.5, Means.arithmetic(numbers)); + } + + @Test + void geometricMeanSingleNumber() { + List numbers = Lists.newArrayList(2.5); + assertEquals(2.5, Means.geometric(numbers)); + } + + @Test + void harmonicMeanSingleNumber() { + List numbers = Lists.newArrayList(2.5); + assertEquals(2.5, Means.harmonic(numbers)); + } + + @Test + void arithmeticMeanMultipleNumbers() { + List numbers = Lists.newArrayList(1d, 2.5, 83.3, 25.9999, 46.0001, 74.7, 74.5); + assertEquals(44, Means.arithmetic(numbers)); + } + + @Test + void geometricMeanMultipleNumbers() { + List numbers = Lists.newArrayList(1d, 2d, 3d, 4d, 5d, 6d, 1.25); + + assertEquals(2.6426195539300585, Means.geometric(numbers)); + } + + @Test + void harmonicMeanMultipleNumbers() { + List numbers = Lists.newArrayList(1d, 2.5, 83.3, 25.9999, 46.0001, 74.7, 74.5); + assertEquals(4.6697322801074135, Means.harmonic(numbers)); + } +} \ No newline at end of file From a8fd9346d24e9cb47b9240e1e7597e6fa81e7d89 Mon Sep 17 00:00:00 2001 From: punit Date: Thu, 31 Aug 2023 16:49:28 +0530 Subject: [PATCH 4/8] Review Comment changes --- src/main/java/com/thealgorithms/maths/Means.java | 1 + 1 file changed, 1 insertion(+) diff --git a/src/main/java/com/thealgorithms/maths/Means.java b/src/main/java/com/thealgorithms/maths/Means.java index 6ad7c059cec5..32ea35911441 100644 --- a/src/main/java/com/thealgorithms/maths/Means.java +++ b/src/main/java/com/thealgorithms/maths/Means.java @@ -9,6 +9,7 @@ */ public final class Means { + private Means() {} /** * Arithmetic / Pythagorean Mean = (x₁ + x₂ + ... + xₙ) / n */ From a899fcdb1829773438e2344cb1a708f2cf7d2810 Mon Sep 17 00:00:00 2001 From: punit Date: Thu, 31 Aug 2023 16:52:10 +0530 Subject: [PATCH 5/8] fixed formatting issue --- src/main/java/com/thealgorithms/maths/Means.java | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/main/java/com/thealgorithms/maths/Means.java b/src/main/java/com/thealgorithms/maths/Means.java index 32ea35911441..1ab633e63478 100644 --- a/src/main/java/com/thealgorithms/maths/Means.java +++ b/src/main/java/com/thealgorithms/maths/Means.java @@ -9,7 +9,9 @@ */ public final class Means { - private Means() {} + private Means() { + } + /** * Arithmetic / Pythagorean Mean = (x₁ + x₂ + ... + xₙ) / n */ From 12c471f7e12cdcc45f2feb1abb98b3ea4496ab8d Mon Sep 17 00:00:00 2001 From: punit Date: Fri, 1 Sep 2023 12:33:33 +0530 Subject: [PATCH 6/8] changes for review comments --- pom.xml | 9 +++- .../java/com/thealgorithms/maths/Means.java | 42 +++++++++++++------ .../com/thealgorithms/maths/MeansTest.java | 19 +++++---- 3 files changed, 48 insertions(+), 22 deletions(-) diff --git a/pom.xml b/pom.xml index 0347ccdba919..86922e1f0a98 100644 --- a/pom.xml +++ b/pom.xml @@ -1,7 +1,7 @@ + xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" + xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> 4.0.0 com.thealgorithms Java @@ -52,6 +52,11 @@ commons-lang3 3.12.0 + + org.apache.commons + commons-collections4 + 4.4 + diff --git a/src/main/java/com/thealgorithms/maths/Means.java b/src/main/java/com/thealgorithms/maths/Means.java index 1ab633e63478..5805cde80e51 100644 --- a/src/main/java/com/thealgorithms/maths/Means.java +++ b/src/main/java/com/thealgorithms/maths/Means.java @@ -1,6 +1,7 @@ package com.thealgorithms.maths; -import java.util.List; +import java.util.stream.StreamSupport; +import org.apache.commons.collections4.IterableUtils; /** * https://en.wikipedia.org/wiki/Mean @@ -13,29 +14,44 @@ private Means() { } /** - * Arithmetic / Pythagorean Mean = (x₁ + x₂ + ... + xₙ) / n + * @brief computes the [Arithmetic Mean](https://en.wikipedia.org/wiki/Arithmetic_mean) of the input + * @param numbers the input numbers + * @throws IllegalArgumentException empty input + * @return the arithmetic mean of the input numbers */ - public static Double arithmetic(final List numbers) { - if (numbers.isEmpty()) throw new IllegalArgumentException("Emtpy list given for Mean computation."); + public static Double arithmetic(final Iterable numbers) { + if (!numbers.iterator().hasNext()) { + throw new IllegalArgumentException("Emtpy list given for Mean computation."); + } - return numbers.stream().reduce((x, y) -> x + y).get() / numbers.size(); + return StreamSupport.stream(numbers.spliterator(), false).reduce((x, y) -> x + y).get() / IterableUtils.size(numbers); } /** - * Geometric Mean = (x₁ · x₂ · ... · xₙ) ^ 1/n + * @brief computes the [Geometric Mean](https://en.wikipedia.org/wiki/Geometric_mean) of the input + * @param numbers the input numbers + * @throws IllegalArgumentException empty input + * @return the geometric mean of the input numbers */ - public static Double geometric(final List numbers) { - if (numbers.isEmpty()) throw new IllegalArgumentException("Emtpy list given for Mean computation."); + public static Double geometric(final Iterable numbers) { + if (!numbers.iterator().hasNext()) { + throw new IllegalArgumentException("Emtpy list given for Mean computation."); + } - return Math.pow(numbers.stream().reduce((x, y) -> x * y).get(), 1.0 / numbers.size()); + return Math.pow(StreamSupport.stream(numbers.spliterator(), false).reduce((x, y) -> x * y).get(), 1.0 / IterableUtils.size(numbers)); } /** - * Harmonic Mean = n / (1/x₁ + 1/x₂ + ... + 1/xₙ) + * @brief computes the [Harmonic Mean](https://en.wikipedia.org/wiki/Harmonic_mean) of the input + * @param numbers the input numbers + * @throws IllegalArgumentException empty input + * @return the harmonic mean of the input numbers */ - public static double harmonic(final List numbers) { - if (numbers.isEmpty()) throw new IllegalArgumentException("Emtpy list given for Mean computation."); + public static double harmonic(final Iterable numbers) { + if (!numbers.iterator().hasNext()) { + throw new IllegalArgumentException("Emtpy list given for Mean computation."); + } - return numbers.size() / numbers.stream().map(x -> 1 / x).reduce((x, y) -> x + y).get(); + return IterableUtils.size(numbers) / StreamSupport.stream(numbers.spliterator(), false).map(x -> 1 / x).reduce((x, y) -> x + y).get(); } } diff --git a/src/test/java/com/thealgorithms/maths/MeansTest.java b/src/test/java/com/thealgorithms/maths/MeansTest.java index 9e7b5ee94c06..fa17cea68f7c 100644 --- a/src/test/java/com/thealgorithms/maths/MeansTest.java +++ b/src/test/java/com/thealgorithms/maths/MeansTest.java @@ -3,8 +3,13 @@ import static org.junit.jupiter.api.Assertions.*; import java.util.ArrayList; +import java.util.LinkedHashSet; +import java.util.LinkedList; import java.util.List; +import java.util.Set; +import java.util.Vector; import org.assertj.core.util.Lists; +import org.assertj.core.util.Sets; import org.junit.jupiter.api.Test; class MeansTest { @@ -35,32 +40,32 @@ void arithmeticMeanSingleNumber() { @Test void geometricMeanSingleNumber() { - List numbers = Lists.newArrayList(2.5); + Set numbers = Sets.newHashSet(Lists.newArrayList(2.5)); assertEquals(2.5, Means.geometric(numbers)); } @Test void harmonicMeanSingleNumber() { - List numbers = Lists.newArrayList(2.5); + LinkedHashSet numbers = Sets.newLinkedHashSet(2.5); assertEquals(2.5, Means.harmonic(numbers)); } @Test void arithmeticMeanMultipleNumbers() { - List numbers = Lists.newArrayList(1d, 2.5, 83.3, 25.9999, 46.0001, 74.7, 74.5); + Set numbers = Sets.newTreeSet(1d, 2.5, 83.3, 25.9999, 46.0001, 74.7, 74.5); assertEquals(44, Means.arithmetic(numbers)); } @Test void geometricMeanMultipleNumbers() { - List numbers = Lists.newArrayList(1d, 2d, 3d, 4d, 5d, 6d, 1.25); - + LinkedList numbers = new LinkedList<>() {}; + numbers.addAll(Lists.newArrayList(1d, 2d, 3d, 4d, 5d, 6d, 1.25)); assertEquals(2.6426195539300585, Means.geometric(numbers)); } @Test void harmonicMeanMultipleNumbers() { - List numbers = Lists.newArrayList(1d, 2.5, 83.3, 25.9999, 46.0001, 74.7, 74.5); + Vector numbers = new Vector<>(Lists.newArrayList(1d, 2.5, 83.3, 25.9999, 46.0001, 74.7, 74.5)); assertEquals(4.6697322801074135, Means.harmonic(numbers)); } -} \ No newline at end of file +} From 046bfc454e0794c0570bb93f708326218cf668f8 Mon Sep 17 00:00:00 2001 From: punit Date: Sat, 2 Sep 2023 12:19:05 +0530 Subject: [PATCH 7/8] changes for review comments --- .../java/com/thealgorithms/maths/Means.java | 19 ++++++++----------- 1 file changed, 8 insertions(+), 11 deletions(-) diff --git a/src/main/java/com/thealgorithms/maths/Means.java b/src/main/java/com/thealgorithms/maths/Means.java index 5805cde80e51..ed29c132bf5e 100644 --- a/src/main/java/com/thealgorithms/maths/Means.java +++ b/src/main/java/com/thealgorithms/maths/Means.java @@ -20,10 +20,7 @@ private Means() { * @return the arithmetic mean of the input numbers */ public static Double arithmetic(final Iterable numbers) { - if (!numbers.iterator().hasNext()) { - throw new IllegalArgumentException("Emtpy list given for Mean computation."); - } - + checkIfNotEmpty(numbers); return StreamSupport.stream(numbers.spliterator(), false).reduce((x, y) -> x + y).get() / IterableUtils.size(numbers); } @@ -34,10 +31,7 @@ public static Double arithmetic(final Iterable numbers) { * @return the geometric mean of the input numbers */ public static Double geometric(final Iterable numbers) { - if (!numbers.iterator().hasNext()) { - throw new IllegalArgumentException("Emtpy list given for Mean computation."); - } - + checkIfNotEmpty(numbers); return Math.pow(StreamSupport.stream(numbers.spliterator(), false).reduce((x, y) -> x * y).get(), 1.0 / IterableUtils.size(numbers)); } @@ -47,11 +41,14 @@ public static Double geometric(final Iterable numbers) { * @throws IllegalArgumentException empty input * @return the harmonic mean of the input numbers */ - public static double harmonic(final Iterable numbers) { + public static Double harmonic(final Iterable numbers) { + checkIfNotEmpty(numbers); + return IterableUtils.size(numbers) / StreamSupport.stream(numbers.spliterator(), false).reduce(0.0, (x, y) -> x + 1 / y); + } + + private static void checkIfNotEmpty(final Iterable numbers) { if (!numbers.iterator().hasNext()) { throw new IllegalArgumentException("Emtpy list given for Mean computation."); } - - return IterableUtils.size(numbers) / StreamSupport.stream(numbers.spliterator(), false).map(x -> 1 / x).reduce((x, y) -> x + y).get(); } } From ad3c074da1b6f04426c4eb2f26efca9017323301 Mon Sep 17 00:00:00 2001 From: punit Date: Sat, 2 Sep 2023 14:06:41 +0530 Subject: [PATCH 8/8] making all constant numbers of double type --- src/main/java/com/thealgorithms/maths/Means.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/main/java/com/thealgorithms/maths/Means.java b/src/main/java/com/thealgorithms/maths/Means.java index ed29c132bf5e..dccc820b172e 100644 --- a/src/main/java/com/thealgorithms/maths/Means.java +++ b/src/main/java/com/thealgorithms/maths/Means.java @@ -32,7 +32,7 @@ public static Double arithmetic(final Iterable numbers) { */ public static Double geometric(final Iterable numbers) { checkIfNotEmpty(numbers); - return Math.pow(StreamSupport.stream(numbers.spliterator(), false).reduce((x, y) -> x * y).get(), 1.0 / IterableUtils.size(numbers)); + return Math.pow(StreamSupport.stream(numbers.spliterator(), false).reduce((x, y) -> x * y).get(), 1d / IterableUtils.size(numbers)); } /** @@ -43,7 +43,7 @@ public static Double geometric(final Iterable numbers) { */ public static Double harmonic(final Iterable numbers) { checkIfNotEmpty(numbers); - return IterableUtils.size(numbers) / StreamSupport.stream(numbers.spliterator(), false).reduce(0.0, (x, y) -> x + 1 / y); + return IterableUtils.size(numbers) / StreamSupport.stream(numbers.spliterator(), false).reduce(0d, (x, y) -> x + 1d / y); } private static void checkIfNotEmpty(final Iterable numbers) {