在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时,您才需要一个。这是一个我想不到的简单方法,谢谢