在我目前的项目中,我将编写一个计算平均温度的函数。
此功能的一个值得注意的地方是它在不同时间从许多温度源接收数据。你能告诉我“我怎么能用这样的行为写一个函数?”
例如,以下功能从许多温度传感器接收tempSensorData
,该传感器在不同时间发送温度数据。我需要写一个计算平均温度的逻辑。
public void calculateRoomAvgTemp(TempStruct tempSensorData) {
// Write logic of calculating Average Temperature.
}
答案 0 :(得分:3)
为什么不保持平均运行?假设每次进行温度读数时都会调用您的方法,您可以执行以下操作:
private final List<Double> temps = Collections
.synchronizedList(new ArrayList<Double>());
private double currentAverage = 0d;
public void calculateRoomAvgTemp(TempStruct tempSensorData) {
synchronized (this.temps) {
this.temps.add(tempSensorData.temp);
this.currentAverage = 0d;
for (Double temp : this.temps) {
this.currentAverage += temp;
}
this.currentAverage /= this.temps.size();
}
}
答案 1 :(得分:1)
你可以将过去的温度存储在课堂上的一个单独的领域吗?我注意到你的方法是无效的,因此不会返回任何内容。我假设您要将平均值存储在单独的字段中。例如:
public class TempCalculator {
private double totalTemp = 0;
private int sensors = 0;
private double averageTemp = 0;
public void calculateRoomAvgTemp(TempStruct tempSensorData) {
totalTemp += tempSensorData.getTemp(); // Assuming getTemp() exists
sensors += 1;
averageTemp = totalTemp / sensors;
}
public double getAvgTemp() {
return averageTemp;
}
}
当然,如果您想存储使用的温度并根据您的需求进行调整,可以使用列表来完成此操作。希望这会有所帮助。
答案 2 :(得分:1)
我能想到的一种方法 - 在将数据接收到ArrayList时插入值。如果需要计算接收到的每个数据点之后的平均温度,请运行for循环并平均化ArrayList中的数据点以获得所需的值。人们可以考虑使用memoization来避免为所有值运行循环。
另一个选择是使用apache commons math,你可以使用描述性统计选项(使用滚动数组)来获得平均值(平均值)。
我假设您的代码是单线程的。如果是多线程的,您可以使用线程安全向量(或自己添加锁/同步)。 希望这会有所帮助。
答案 3 :(得分:1)
要计算平均值而不将所有历史值保留在内存(或数据库)中,请使用“moving average”。这个数学工具可以为您提供最后一个加上当前值的新平均值。
答案 4 :(得分:0)
您可以创建一个用于计算温度的线程,以及许多用于测量不同位置值的线程。当完成一些测量时,线程将结果推送到例如LinkedBlockingQueue
。同步此操作很重要,因为许多线程可能会尝试同时推送结果。计算平均温度的线程将在循环中运行,从队列中弹出新结果,重新计算温度,然后再次尝试弹出另一个结果。只要队列为空,线程就会在读取时被阻塞。通过这种方式,您可以在线程之间进行异步通信,并在测量完成后立即重新计算平均温度。