добавление элемента во время итерации в специальном сценарии Java - PullRequest
0 голосов
/ 13 декабря 2018

У меня есть функция, которая должна возвращать список дат (java.sql.Date) в пределах диапазона, установленного как startDate - endDate.Сначала я добавил startDate и хочу увеличить его (+1 день, неделю или месяц), а затем продолжаю переходить от «самой новой» даты до достижения 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;
    }                   
}

Ответы [ 2 ]

0 голосов
/ 13 декабря 2018

Почему вы хотите сделать цикл 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;
}
0 голосов
/ 13 декабря 2018

Используйте ListIterator::nextIndex() при добавлении нового элемента, а затем сбросьте переменную итератора на ArrayList::listIterator(int index).

...