2012-04-27 56 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作为关键字。我希望这是有道理的。

相关问题