2012-04-27 2 views
0

У меня есть этот класс Log:Как узнать, когда изменяется времяStamp?

private Integer id; 

private Timestamp time; 

private String value; 

Я хочу, чтобы генерировать отчеты о среднем в этих интервалах: seconds, minutes, hours, days, months, years. Например, у меня есть эти значения в 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 

Ребята, у вас есть любая идея, как я мог это сделать?

+0

Прокрутите каждый элемент журнала, если он имеет такое же значение минут, а затем добавьте его в общую сумму внутри карты, а также сохраните отдельный список подсчетов за каждую минуту. Затем повторите цикл и распечатайте итоговое значение/count – BeRecursive

+0

И могу ли я предложить вам использовать JodaTime вместо (что я предполагаю) java.sql.Timestamp – BeRecursive

+1

@BeRecursive проблема в этом, как я теперь, когда они разные? Не могли бы вы показать мне пример? –

ответ

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 в Log конструктор, но не против STO кольцо внутри себя как объект JodaTime DateTime. Затем мы создаем несколько поддельных журналов. Затем мы перебираем все журналы и сохраняем до ближайшей минуты как счетчик, так и общее количество. Реально я создавал бы объект для хранения этих данных (как общего числа, так и числа), а затем использовал в качестве ключа DateTime. Я надеюсь в этом есть смысл.

Смежные вопросы