From 1174ace019bfc03a1eeb105253b8b019158df715 Mon Sep 17 00:00:00 2001 From: Martin Goik <goik@hdm-stuttgart.de> Date: Fri, 30 Jun 2023 09:57:03 +0200 Subject: [PATCH] Minor code and comment enhancements, additional tests --- .../mi/sd1/task1/C_ArrayHelper.java | 27 +++++++++++-------- .../mi/sd1/task1/C_ArrayHelperTest.java | 18 ++++++++++++- 2 files changed, 33 insertions(+), 12 deletions(-) diff --git a/Klausuren/Sd1/2021winter/Solve/src/main/java/de/hdm_stuttgart/mi/sd1/task1/C_ArrayHelper.java b/Klausuren/Sd1/2021winter/Solve/src/main/java/de/hdm_stuttgart/mi/sd1/task1/C_ArrayHelper.java index 5997a5dc4..2bf597b24 100644 --- a/Klausuren/Sd1/2021winter/Solve/src/main/java/de/hdm_stuttgart/mi/sd1/task1/C_ArrayHelper.java +++ b/Klausuren/Sd1/2021winter/Solve/src/main/java/de/hdm_stuttgart/mi/sd1/task1/C_ArrayHelper.java @@ -38,24 +38,29 @@ public class C_ArrayHelper { */ static public int[] getAboveAverage (int[] values) { - final int length = values.length; - long sum = 0; - + // Step 1: Calculate the sum of all values + long sum = 0; // Avoiding int overflow for (final int v: values) { sum += v; } - final int[] result = new int[length]; - int index = 0; + // Step 2: Create a »shadow« array and insert all values above average + // + final int allValuesCount = values.length; + final int[] result = new int[allValuesCount - 1 /* At least one value is below average */]; + int lastAboveValueIndex = 0; - for (final int vTmp: values) { - final long v = vTmp; // Tribute to values exceeding Integer.INT_MAX - if (sum < length * v) { - result[index++] = vTmp; + for (final int v: values) { + // Multiply by count of values rather than calculating the average thereby avoiding rounding problems. + // + if (sum < allValuesCount * ((long) v) /* avoiding int overflow */) { + result[lastAboveValueIndex++] = v; } } - return Arrays.copyOf(result, index); + + // Step three: Shorten shadow array to actual values above average. + // + return Arrays.copyOf(result, lastAboveValueIndex); } private C_ArrayHelper(){/* Ignore me: My sole purpose is suppressing default constructor javadoc generation */} - } diff --git a/Klausuren/Sd1/2021winter/Solve/src/test/java/de/hdm_stuttgart/mi/sd1/task1/C_ArrayHelperTest.java b/Klausuren/Sd1/2021winter/Solve/src/test/java/de/hdm_stuttgart/mi/sd1/task1/C_ArrayHelperTest.java index bb48553fe..6a13e7a67 100644 --- a/Klausuren/Sd1/2021winter/Solve/src/test/java/de/hdm_stuttgart/mi/sd1/task1/C_ArrayHelperTest.java +++ b/Klausuren/Sd1/2021winter/Solve/src/test/java/de/hdm_stuttgart/mi/sd1/task1/C_ArrayHelperTest.java @@ -32,11 +32,27 @@ public class C_ArrayHelperTest extends ExaminationTestDefaults { Assert.assertArrayEquals(new int[]{1}, getAboveAverage(new int[]{0, 1})); Assert.assertArrayEquals(new int[]{5, 4}, getAboveAverage(new int[]{1, 2, 3, 5, 4})); Assert.assertArrayEquals(new int[]{55, 100}, getAboveAverage(new int[]{-30, 2, 4, 55, 100, 9})); + + Assert.assertArrayEquals(new int[]{0, 0, 0, 0, 0, 0, 0, 0, 0, 0,0, 0, 0}, + getAboveAverage(new int[]{0, 0, 0, 0, 0, 0, -1, 0, 0, 0, 0,0, 0, 0})); + + Assert.assertArrayEquals(new int[]{0, 0, 0, 0, 0, 0, 0, 0, 0,0, 0, 0}, + getAboveAverage(new int[]{-1, 0, 0, 0, 0, 0, 0, 0, 0, 0,0, 0, 0})); + + Assert.assertArrayEquals(new int[]{0, 0, 0, 0, 0, 0, 0, 0, 0, 0,0, 0, 0}, + getAboveAverage(new int[]{0, 0, 0, 0, 0, 0, 0, 0, 0, 0,0, 0, 0, -1})); } @Test @Marking(points = 2) public void test_200_big() { - Assert.assertArrayEquals(new int[]{Integer.MAX_VALUE, Integer.MAX_VALUE}, getAboveAverage(new int[]{Integer.MAX_VALUE, Integer.MAX_VALUE, 0})); + Assert.assertArrayEquals(new int[]{Integer.MAX_VALUE, Integer.MAX_VALUE}, + getAboveAverage(new int[]{0, Integer.MAX_VALUE, Integer.MAX_VALUE})); + + Assert.assertArrayEquals(new int[]{Integer.MAX_VALUE, Integer.MAX_VALUE}, + getAboveAverage(new int[]{Integer.MAX_VALUE, 0, Integer.MAX_VALUE})); + + Assert.assertArrayEquals(new int[]{Integer.MAX_VALUE, Integer.MAX_VALUE}, + getAboveAverage(new int[]{Integer.MAX_VALUE, Integer.MAX_VALUE, 0})); } } -- GitLab