2012-04-27 101 views
0

我有這個類Log如何知道timeStamp何時更改?

private Integer id; 

private Timestamp time; 

private String value; 

我要產生大約平均在這些間隔報告:seconds, minutes, hours, days, months, years

代碼:

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

輸出: 舉例來說,我在List<Log> logs有下列值

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 

你們是否有任何想法我怎麼能做到這一點?

+0

在每個日誌項目上循環,如果它具有相同的分鐘值,然後將其添加到地圖內的正在運行的總計中,還要爲每分鐘保留一個單獨的計數列表。然後循環再打印總數/計數 – BeRecursive 2012-04-27 15:50:44

+0

我可以建議你使用JodaTime而不是(我所假設的)java.sql.Timestamp – BeRecursive 2012-04-27 15:52:36

+1

@BeRecursive問題是這樣的,我現在怎麼樣,他們是不同的?你能告訴我一些例子嗎? – 2012-04-27 16:18:09

回答

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())); 
} 

在這裏,我想你還是會希望在Log構造使用TimeStamp但不介意STO在內部將其作爲JodaTime DateTime對象進行響鈴。然後我們創建一些假日誌。然後,我們遍歷所有日誌並存儲到最近的分鐘數和總數。實際上,我會創建一個對象來存儲這些數據(包括總數和總數),然後使用DateTime作爲關鍵字。我希望這是有道理的。

相關問題