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