0

現在のプロジェクトでは、平均気温を計算する関数を作成します。

この機能の注目すべき点は、さまざまな時間に多くの温度ソースからデータを受信することです。「このような振る舞いをする関数をどうやって書くことができますか?」とアドバイスしてもらえますか?

たとえば、次の関数は、さまざまな時間に温度データを送信tempSensorDataする多くの温度センサーから受信します。平均気温を計算するロジックを書く必要があります。

public void calculateRoomAvgTemp(TempStruct tempSensorData) {

   // Write logic of calculating Average Temperature.

}
4

5 に答える 5

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();
    }
}
于 2012-06-22T12:44:48.383 に答える
1

私が考えることができる1つの方法-ArrayListに値を受け取ったときに値を挿入します。受信した各データポイントの後で平均温度を計算する必要がある場合は、forループを実行し、ArrayList内のデータポイントを平均して、必要な値を取得します。すべての値のループを実行しないように、メモ化を使用することを検討できます。

もう1つのオプションは、記述統計オプション(ローリング配列を使用)を使用して平均(平均)を取得できるapachecommonsmathを使用することです。

私はあなたのコードがシングルスレッドであると仮定しています。マルチスレッドの場合は、スレッドセーフなベクターを使用できます(または独自にロック/同期を追加できます)。お役に立てれば。

于 2012-06-22T12:49:22.470 に答える
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;
    }
}

もちろん、必要に応じて使用および成形された温度を保存する場合は、リストを使用してこれを行うことができます。お役に立てれば。

于 2012-06-22T12:46:47.967 に答える
1

すべての履歴値をメモリ(またはデータベース)に保持せずに平均を計算するには、「移動平均」を使用します。この数学ツールは、最後の平均から現在の値を加えた新しい平均を提供します。

于 2012-06-22T13:55:32.450 に答える
0

温度を計算する1つのスレッドと、さまざまな場所からの値を測定する多くのスレッドを作成できます。何らかの測定が行われると、スレッドは結果をたとえばにプッシュしLinkedBlockingQueueます。多くのスレッドが同時に結果をプッシュしようとする可能性があるため、この操作を同期することが重要です。平均気温を計算するスレッドはループで実行され、キューから新しい結果をポップし、温度を再計算してから、もう一度別の結果をポップしようとします。キューが空になる限り、スレッドはキューからの読み取り時にブロックされます。このようにして、スレッド間で非同期通信が行われ、測定が行われた直後に平均温度が再計算されます。

于 2012-06-22T12:44:58.820 に答える