在 java 特殊用例中的迭代期间添加项目
adding item during iteration in java special usecase
我有一个函数应该 return 日期列表 (java.sql.Date
) 基于 startDate
- endDate
的范围。我首先添加了 startDate
并希望增加它(+1 天、周或月),然后从 "newest" 日期继续直到到达 endDate。
我试过使用传统的 foreach,但它不起作用,因为它不允许在迭代时添加新日期,所以我切换到 ListIterator
。
这只进入 while
一次,增加日期,添加它但显然没有 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;
}
}
添加新项时使用ListIterator::nextIndex()
,然后将迭代器变量重置为ArrayList::listIterator(int index)
。
为什么要基于 Iterator 做 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;
}
我有一个函数应该 return 日期列表 (java.sql.Date
) 基于 startDate
- endDate
的范围。我首先添加了 startDate
并希望增加它(+1 天、周或月),然后从 "newest" 日期继续直到到达 endDate。
我试过使用传统的 foreach,但它不起作用,因为它不允许在迭代时添加新日期,所以我切换到 ListIterator
。
这只进入 while
一次,增加日期,添加它但显然没有 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;
}
}
添加新项时使用ListIterator::nextIndex()
,然后将迭代器变量重置为ArrayList::listIterator(int index)
。
为什么要基于 Iterator 做 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;
}