2010-08-17 31 views
1

我有網格將呈現一個日曆,並提供了一個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 2010-08-17 14:10:32

+0

我自己多次使用過這種模式。如果您使用的是多線程應用程序,請確保同步對HashMap的所有訪問以避免衝突。 – 2010-08-17 16:21:49

1

這是一個可以從使用(排序)樹中受益的問題的經典示例。 Java在TreeMap中提供了一個。您可以使用subMap方法從一天開始獲得事件。 Calendar implements Comparable,所以它應該只是工作。 (使用日曆條目作爲鍵;從前一天的最後一秒到第二天的第一秒使用subMap以獲得當天所有的事件。)

如果您有多天事件,那麼你需要一個間隔樹,但它可能更容易將單個事件「五天研討會」分成五個條目「研討會,第一天五」等,以便沒有事件從一天到另一個。

+0

我已經按Erick Robertson告訴我的方式實施了。雖然,我真的很喜歡你的想法,所以我認爲我會按照你的建議實施第二個版本。然後我會比較表現並讓你知道。謝謝。 – Cristian 2010-08-17 20:11:25

+0

@克里斯蒂安:如果你只需要搜索一天,埃裏克的方法至少可以工作,如果不是更好。然而,如果你需要搜索,比如說早晨,或者整週或者其他什麼,那麼'TreeMap'方法將使事情變得更加容易和更加一致:只要求一個不同的時間間隔,它就會給它給你。 – 2010-08-17 20:44:28