0

私はこのクラスを持っていますLog:

private Integer id;

private Timestamp time;

private String value;

これらの間隔の平均に関するレポートを生成したい: seconds, minutes, hours, days, months, years. たとえば、次の値が a にありList<Log> logsます。

コード:

for (Log log : logs)
            System.out.println(log.getTime().toString() + " " + log.getValue() + ", ");

出力:

INFO: 2012-04-26 20:06:21.0 10.0, 
INFO: 2012-04-27 09:09:32.0 10.0, 
INFO: 2012-04-27 09:31:09.0 15.0, 
INFO: 2012-04-27 09:31:23.0 27.0, 
INFO: 2012-04-27 09:31:42.0 30.0, 
INFO: 2012-04-27 09:31:54.0 47.0, 
INFO: 2012-04-27 12:19:00.0 80.0, 

で平均を取りたいminutes場合、結果は次のようになります。

10 / 1 = 10, 
10 / 1 = 10, 
15 + 27 + 30 + 47 = 119/4 = 29.75
80 / 1 = 80

どうすればこれができるか分かりますか?

4

1 に答える 1

0

わかりました、このようなものはどうですか (ただし、あなたがまだ苦労しているのを見てすぐにこれをまとめました - カウントを維持するためのマップの使用は素晴らしいものではありません):

ログを次のように変更します。

Integer id;
DateTime time;
String value;

public Log(Integer id, Timestamp time, String value) {
    this.id = id;
    this.time = new DateTime(time.getTime());
    this.value = value;
}

それで:

// Build some fake logs
final List<Log> logs = new ArrayList<Log>();
logs.add(new Log(1, new Timestamp(new DateTime().withDate(2011,1,1).getMillis()), "90"));
logs.add(new Log(1, new Timestamp(new DateTime().withDate(2010,1,1).withTimeAtStartOfDay().getMillis()), "60"));
logs.add(new Log(1, new Timestamp(new DateTime().withDate(2010,1,1).withTimeAtStartOfDay().getMillis()), "80"));
logs.add(new Log(1, new Timestamp(new DateTime().withDate(2009,1,1).getMillis()), "70"));
final Map<DateTime, Integer> total = new HashMap<DateTime, Integer>();
final Map<DateTime, Integer> count = new HashMap<DateTime, Integer>();

for(Log l : logs) {
    // Round down to the nearest minute
    final DateTime t = l.getTime().withSecondOfMinute(0);
    Integer sum = total.get(t);
    sum = (sum == null) ? 0 : sum;
    total.put(t, sum + Integer.parseInt(l.getValue()));

    Integer c = count.get(t);
    c = (c == null) ? 0 : c;
    count.put(t, c + 1);
}

for(Map.Entry<DateTime, Integer> entry : total.entrySet()) {
    System.out.println(entry.getValue() / count.get(entry.getKey()));
}

ここでは、引き続きコンストラクターで使用することを想定していますがTimeStamp、 JodaTimeオブジェクトLogとして内部に格納してもかまいません。DateTime次に、いくつかの偽のログを作成します。次に、すべてのログをループして、カウントと合計の両方を最も近い分に保存します。現実的には、このデータ (合計とカウントの両方) を格納するオブジェクトを作成し、それをDateTimeキーとして使用します。これが理にかなっていることを願っています。

于 2012-04-28T09:10:13.780 に答える