2010-08-17 2 views
1

캘린더를 렌더링하는 Grid가 있으며 이벤트가 포함 된 ArrayList<CalendarEventEntity>이 제공됩니다. 이러한 이벤트는 그리드에서 강조 표시되어야합니다. 나는 내 자신에 의해 그리드를 채우기 위해 가지고캘린더 그리드를 채우는 알고리즘을 개선하는 방법은 무엇입니까?

나는 이런 일이 :

for(loop through the days of the month){ 
    Calendar eventDate = event.getDate(); 
    // look for the events in the calendar that matchs this day 
    for(CalendarEventEntity event : events) { 
     // if there are events in this specific day 
     if(eventDate.get(Calendar.YEAR) == calendarMonth.get(Calendar.YEAR) && 
      eventDate.get(Calendar.MONTH) == calendarMonth.get(Calendar.MONTH) && 
      eventDate.get(Calendar.DAY_OF_MONTH) == dayIndex) { 
      // highlight it!!! 
     } 
    } 

} 

이 잘 작동을하지만 너무 느리다. 그래서 나는 그것을 속도를 내고 싶다! 나는 내부 for 전에이 추가 :

// ignore dates which does not make part of this month or year 
if(eventDate.get(Calendar.YEAR) < calendarMonth.get(Calendar.YEAR) || 
    eventDate.get(Calendar.MONTH) < calendarMonth.get(Calendar.MONTH) || 
    eventDate.get(Calendar.DAY_OF_MONTH) != DateIdx) { 
    continue; 
} 

// stop when processing dates which are higher than this month or year 
if(eventDate.get(Calendar.YEAR) > calendarMonth.get(Calendar.YEAR) || 
    eventDate.get(Calendar.MONTH) > calendarMonth.get(Calendar.MONTH) 
    || eventDate.get(Calendar.DAY_OF_MONTH) != DateIdx) { 
    break; 
} 

하고 빠르게 경우 만들었지 만, 그것은 여전히 ​​너무 느리다. 이 알고리즘을 어떻게 향상시킬 수 있습니까?

답변

3

매일 문제가 발생하면 해당 날짜의 이벤트를 검색해야합니다. 그 날 행사를 통해서만 검색하거나 그 날 행사가 있는지를 알 수있는 방법을 찾아야합니다.

HashMap을 사용하여 날짜별로 인덱싱 된 이벤트를 저장하는 것이 좋습니다. 그런 다음 해당 날짜의 HashMap 항목이 있는지 확인할 수 있습니다. 키로 사용하기에 충분히 보편적 인 하루를 표현할 방법을 선택해야합니다.

특정 날짜의 세부 정보를 드릴 다운하고 해당 날짜의 이벤트 만 표시해야 할 때 유용합니다. 특정 날짜의 이벤트를 찾을 때마다 모든 이벤트를 검색하지 않아도됩니다.

+0

저는 HashMap에 대해 생각해 보지 않았습니다. 나는 그것이 정말로 도움이되는지보기 위해 지금 시도해 볼 것입니다. 그러나, 나는 너무 복잡하게 만들고 싶지 않고, HashMap을 사용하는 것은 다음과 같을 것이다 :'HashMap >'. – Cristian

+0

저는 여러 번 그 패턴을 사용했습니다. 멀티 스레드 응용 프로그램을 사용하는 경우 충돌을 피하기 위해 HashMap에 대한 모든 액세스를 동기화해야합니다. –

1

이것은 (정렬 된) 트리를 사용하면 도움이되는 고전적인 예제입니다. Java는 TreeMap에 하나를 제공합니다. subMap 메소드를 사용하여 하루에 시작하는 이벤트를 가져올 수 있습니다. CalendarComparable을 구현하므로 제대로 작동합니다. (일정 항목을 키로 사용하고, 전날의 마지막 날부터 다음 날의 첫 번째 날까지 subMap을 사용하여 해당 날짜의 모든 이벤트를 가져옵니다.)

많은 멀티 일 이벤트가 있다면 구간 트리가 필요 하겠지만 단일 이벤트 "Five Day Workshop"을 5 개의 항목 "Workshop, Five of One of Five"로 분할하는 것이 더 쉬울 수도 있습니다. 따라서 이벤트가 어느 날부터 다른.

+0

에릭 로버트슨이 말한 방식대로 이미 구현했습니다. 비록 당신의 제안을 두 번째 버전으로 구현할 것이라고 생각합니다. 그러면 성능을 비교하고 알려 드리겠습니다. 감사. – Cristian

+0

@ 크리스티안 : 단 하루 만 검색 할 필요가있는 경우 에릭의 방법은 좋지 않을지라도 적어도 효과가있을 것입니다. 그러나, 아침, 일주일, 또는 무엇이든간에 검색해야하는 경우,'TreeMap' 메소드는 일을 더 쉽고 일관성있게 만들 것입니다 : 단지 다른 시간 간격을 요구하면, 그것을 줄 것입니다. 너에게. –

관련 문제