在java特殊用例中在迭代期间添加项
我有一个函数,它应该返回一个日期列表(在java特殊用例中在迭代期间添加项,java,list,date,iterator,listiterator,Java,List,Date,Iterator,Listiterator,我有一个函数,它应该返回一个日期列表(java.sql.Date),其范围设置为startDate-endDate)。我首先添加了startDate,并希望增加它(一天、一周或一个月),然后从“最新”日期一直到结束日期 我尝试过使用传统的foreach,但它不起作用,因为它不允许在迭代时添加新日期,所以我切换到listierator。 这只进入,而一次,增加日期,添加日期,但显然没有next,因为add函数没有在末尾附加项目(?) 解决这项任务的实际方法是什么 public List<Da
java.sql.Date
),其范围设置为startDate
-endDate
)。我首先添加了startDate
,并希望增加它(一天、一周或一个月),然后从“最新”日期一直到结束日期
我尝试过使用传统的foreach,但它不起作用,因为它不允许在迭代时添加新日期,所以我切换到listierator
。
这只进入,而一次,增加日期,添加日期,但显然没有next
,因为add
函数没有在末尾附加项目(?)
解决这项任务的实际方法是什么
public List<Date> getBookingDatesInRange(Date startDate, Date endDate, boolean isDaily, boolean isWeekly) {
List<Date> dates = new ArrayList<Date>();
dates.add(startDate);
ListIterator<Date> iter = dates.listIterator();
while(iter.hasNext()) {
LocalDate new = iter.next().toLocalDate();
Date newDate;
if(isDaily) {
newDate= Date.valueOf(new.plusDays(1));
} else if(isWeekly) {
newDate= Date.valueOf(new.plusWeeks(1));
} else {
newDate= Date.valueOf(new.plusMonths(1));
}
if(newDate.before(endDate) || newDate.equals(endDate) {
iter.add(newDate);
} else {
return dates;
}
}
public List getBookingDatesInRange(日期开始日期、日期结束日期、布尔值为每日、布尔值为每周){
列表日期=新建ArrayList();
添加日期(起始日期);
ListIterator iter=dates.ListIterator();
while(iter.hasNext()){
LocalDate new=iter.next().toLocalDate();
日期newDate;
如果(每天){
newDate=日期值(新的加上日期(1));
}else if(每周一次){
newDate=日期.valueOf(new.plusWeeks(1));
}否则{
newDate=日期.值(new.plusMonths(1));
}
如果(newDate.before(endDate)| newDate.equals(endDate){
iter.add(新日期);
}否则{
返回日期;
}
}
添加新项时使用ListIterator::nextIndex()
,然后将迭代器变量重置为ArrayList::ListIterator(int-index)
为什么要基于迭代器执行while循环?仅基于迭代期间执行的日期检查是否更符合逻辑
public static List<Date> getBookingDatesInRange(Date startDate, Date endDate, boolean isDaily, boolean isWeekly) {
List<Date> dates = new ArrayList<>();
dates.add(startDate);
Date newDate = startDate;
while(newDate.before(endDate) || newDate.equals(endDate)) {
if(isDaily) {
newDate = Date.valueOf(newDate.toLocalDate().plusDays(1));
} else if(isWeekly) {
newDate = Date.valueOf(newDate.toLocalDate().plusWeeks(1));
} else {
newDate = Date.valueOf(newDate.toLocalDate().plusMonths(1));
}
dates.add(newDate);
}
}
return dates;
}
公共静态列表getBookingDatesInRange(日期开始日期、日期结束日期、布尔值isDaily、布尔值isWeekly){
列表日期=新建ArrayList();
添加日期(起始日期);
日期newDate=开始日期;
while(newDate.before(endDate)| newDate.equals(endDate)){
如果(每天){
newDate=Date.valueOf(newDate.toLocalDate().plusDays(1));
}else if(每周一次){
newDate=Date.valueOf(newDate.toLocalDate().plusWeeks(1));
}否则{
newDate=Date.valueOf(newDate.toLocalDate().plusMonths(1));
}
日期。添加(新日期);
}
}
返回日期;
}
新元素在旧元素之前插入,请参阅文档:您可能不想使用java.sql.Date
,尤其是当您可以使用LocalDate
。使用现代JDBC驱动程序或现代JPA实现(如Hibernate)时您可以将LocalDate
存储到您的SQL数据库中或在查询中使用它。只有当您需要一个Date
用于您现在无法升级的旧API时,您才需要一个。这是一个我想不到的简单方法,谢谢