Reputation: 23
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
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