代码之家  ›  专栏  ›  技术社区  ›  Cristian

如何改进这个填满日历网格的算法?

  •  1
  • Cristian  · 技术社区  · 14 年前

    我有一个网格,它将呈现一个日历,并且我有一个 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;
    }
    

    这使得速度更快,但还是太慢了。如何改进此算法?

    2 回复  |  直到 14 年前
        1
  •  3
  •   Erick Robertson    14 年前

    问题是,每天你都必须搜索每一个事件,寻找那个日期的事件。您需要找到一种只搜索当天事件的方法,或者知道当天是否有事件。

    您应该考虑使用哈希映射来存储按日期索引的事件。然后,您可以检查是否有一个有关一天的hashmap条目。你必须选择一种方式来代表一天,这一天足够普遍,可以作为一把钥匙使用。

    当您需要深入了解某一天的详细信息并只显示该天的事件时,这也很方便。你不应该每次想找到某一天的事件时都要搜索所有的事件。

        2
  •  1
  •   Rex Kerr    14 年前

    这是一个典型的问题例子,使用(排序的)树会有好处。Java提供了一个 TreeMap . 您可以使用 subMap 方法。 Calendar 器具 Comparable ,所以它应该是有效的。(使用日历项作为键;使用 子映射 从前一天的最后一秒到第二天的第一秒,以获取有关日期的所有事件。)

    如果你有许多多天的活动,那么你需要一个间隔树,但它可能只是更容易将单个活动“五天工作坊”分为五个条目“工作坊,五天之一”等,以便没有事件从一天溢出到另一天。