Java 如何改进这种填充日历网格的算法?

Java 如何改进这种填充日历网格的算法?,java,algorithm,performance,Java,Algorithm,Performance,我有一个网格,它将呈现一个日历,并提供了一个包含事件的ArrayList。这些事件必须在网格中突出显示 由于我必须自己填写表格,因此我有如下内容: 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

我有一个网格,它将呈现一个日历,并提供了一个包含事件的
ArrayList
。这些事件必须在网格中突出显示

由于我必须自己填写表格,因此我有如下内容:

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!!!
        }
    }

}
这个很好,但是太慢了。所以我想加快速度!我在的内部
之前添加了以下内容:

// 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;
}
//忽略不属于本月或本年的日期
if(eventDate.get(Calendar.YEAR)calendarMonth.get(Calendar.YEAR)||
eventDate.get(Calendar.MONTH)>calendarMonth.get(Calendar.MONTH)
||eventDate.get(日历.月日)!=DateIdx){
打破
}

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

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

你应该考虑使用HasMax来存储按日期索引的事件。然后,您可以检查是否有一个HashMap条目。您必须选择一种方式来表示一天,这种方式具有足够的通用性,可以用作键


当您必须深入了解某一特定日期的详细信息并仅显示该日期的事件时,这也很方便。您不必每次都搜索某一特定日期的事件。

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

你应该考虑使用HasMax来存储按日期索引的事件。然后,您可以检查是否有一个HashMap条目。您必须选择一种方式来表示一天,这种方式具有足够的通用性,可以用作键


当您必须深入了解某一特定日期的详细信息并仅显示该日期的事件时,这也很方便。您不必每次都要搜索某一天的所有事件。

这是一个典型的问题示例,使用(排序)树可以从中受益。Java在
TreeMap
中提供了一个。您可以使用
subMap
方法获取当天开始的事件<代码>日历
实现了
可比
,因此它应该可以正常工作。(使用日历条目作为键;使用前一天最后一秒到第二天第一秒的
subMap
,以获取当天的所有事件。)


如果您有许多多日活动,那么您需要一个间隔树,但将单个活动“五天研讨会”拆分为五个条目“研讨会,五天中的第一天”等可能会更容易,这样就不会有事件从一天蔓延到另一天。

这是一个经典的问题示例,使用(排序)树会从中受益。Java在
TreeMap
中提供了一个。您可以使用
subMap
方法获取当天开始的事件<代码>日历实现了
可比
,因此它应该可以正常工作。(使用日历条目作为键;使用前一天最后一秒到第二天第一秒的
subMap
,以获取当天的所有事件。)


如果您有许多多日活动,那么您需要一个间隔树,但将单个活动“五天研讨会”拆分为五个条目“研讨会,五天中的第一天”等可能会更容易,这样就不会有事件从一天蔓延到另一天。

我没有考虑过哈希图。我现在就试试看这是否真的有用。不过,我不想让它太复杂,使用HashMap必须是这样的:
HashMap
。我自己已经多次使用过这种模式。如果您使用的是多线程应用程序,请确保同步对HashMap的所有访问以避免冲突。我没有考虑过HashMap。我现在就试试看这是否真的有用。不过,我不想让它太复杂,使用HashMap必须是这样的:
HashMap
。我自己已经多次使用过这种模式。如果您使用的是多线程应用程序,请确保同步对HashMap的所有访问以避免冲突。我已经按照Erick Robertson告诉我的方式实现了它。不过,我真的很喜欢你的想法,所以我想我会按照你的建议实施第二个版本。然后我将比较性能并让您知道。谢谢。@Cristian:如果你只需要搜索一天,Erick的方法即使不是更好,至少也能起到同样的作用。然而,如果你需要搜索,比如说,早上,或者一整周,或者别的什么,那么
TreeMap
方法将使事情变得更简单、更一致:只要请求一个不同的时间间隔,它就会给你。我已经按照Erick Robertson告诉我的方式实现了它。不过,我真的很喜欢你的想法,所以我想我会按照你的建议实施第二个版本。然后我将比较性能并让您知道。谢谢。@Cristian:如果你只需要搜索一天,Erick的方法即使不是更好,至少也能起到同样的作用。然而,如果你需要搜索,比如说,早上,或者一整周,或者其他什么,那么
TreeMap
方法将使事情变得更容易、更一致:只要请求不同的时间间隔,它就会给你。