Valor
Valor

Reputation: 23

Calculate average for nested List

Please tell me an effective way to calculate the average for this structure.

Example:

List<Double> one = Arrays.asList(-17.3, -1.3, 22.3);
List<Double> two = Arrays.asList(-2.3, 12.2, -75.3);
List<Double> three = Arrays.asList(-0.3, 72.0, -22.1);

List<List<Double>> montSensorMetrics = new ArrayList<>();
montSensorMetrics.add(one);
montSensorMetrics.add(two);
montSensorMetrics.add(three);

Expecting :

R = ((-17.3) + (-2.3) + (-0.3)) / 3

List<Double> result = new ArrayList<>();
result.add(R)

Now, I have created a method for calculating the average:

public List<Double> calculateAverageForMetric(List<List<Double>> montSensorMetrics) {
    List<Double> sumAccumulator = new ArrayList<> ();

    for (int j = 0; j < montSensorMetrics.size(); j++) {
        //add first set as is
        if (j == 0) {
            sumAccumulator.addAll(montSensorMetrics.get(j));
            j++;
        }

        var metricData = montSensorMetrics.get(j);

        for (int i = 0; i < metricData.size(); i++) {
            double elementValueInAccumulator = sumAccumulator.get(i);
            double currentValueInMetric = metricData.get(i);
            double sum = elementValueInAccumulator + currentValueInMetric;
            sumAccumulator.set(i, sum);
        }
    }

    return sumAccumulator.stream().map(v - > v / montSensorMetrics.size()).collect(Collectors.toList());
}

Can you please tell me, is this the right decision?

Upvotes: 0

Views: 429

Answers (1)

dassum
dassum

Reputation: 5113

I have used Java 8 stream to get the average of each list.

List<Double> one = Arrays.asList(-17.3, -1.3, 22.3);
List<Double> two = Arrays.asList(-2.3, 12.2, -75.3);
List<Double> three = Arrays.asList(-0.3, 72.0, -22.1);

List<List<Double>> montSensorMetrics = new ArrayList<>();
montSensorMetrics.add(one);
montSensorMetrics.add(two);
montSensorMetrics.add(three);

List<Double> averageValues = IntStream.range(0,montSensorMetrics.size()).mapToDouble(pos -> montSensorMetrics.stream().mapToDouble(outer -> outer.get(pos)).sum()).map(a -> a/montSensorMetrics.size()).boxed().collect(Collectors.toList());
System.out.println(averageValues);

Upvotes: 1

Related Questions