2012-04-27 1 views
0

나는이 클래스 Log 있습니다.타임 스탬프가 변경되는 것을 어떻게 알 수 있습니까? <code>seconds, minutes, hours, days, months, years</code> :</p> <pre><code>private Integer id; private Timestamp time; private String value; </code></pre> <p>내가이 간격의 평균에 대한 보고서를 생성하려면 :

코드 :

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

+0

그리고 (가정하는 것) 대신 JodaTime을 사용할 것을 제안 할 수 있습니다. – 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())); 
} 

나는 여전히 Log 생성자에서 TimeStamp을 사용하고자하는 것으로 가정하지만, STO 상관 없어 내부적으로 JodaTime DateTime 오브젝트로 호출하십시오. 그런 다음 가짜 로그를 만듭니다. 그런 다음 모든 로그를 반복하고 가장 가까운 분 (분 및 총)에 저장합니다. 현실적으로이 데이터를 저장하는 객체를 생성 한 다음 (DateTime) 키를 사용합니다. 나는 이것이 의미가 있기를 바랍니다.

관련 문제

 관련 문제