Java Время Joda - Реализация итератор Диапазона дат

Хорошо. Просто для уточнения это строго не имеет никакого отношения к объявлению. Это имеет отношение только к "перепрыгиванию через инициализацию" (C++ ISO '03 6.7/3)

, Много сообщений здесь упомянуло, что перепрыгивание через объявление может привести к переменной "не быть объявленным". Это не верно. Объект POD может быть объявлен без инициализатора, но он будет иметь неопределенное значение. Например:

switch (i)
{
   case 0:
     int j; // 'j' has indeterminate value
     j = 0; // 'j' initialized to 0, but this statement
            // is jumped when 'i == 1'
     break;
   case 1:
     ++j;   // 'j' is in scope here - but it has an indeterminate value
     break;
}

то, Где объект является не-POD или агрегировал компилятор неявно, добавляет инициализатор, и таким образом, не возможно перепрыгнуть через такое объявление:

class A {
public:
  A ();
};

switch (i)  // Error - jumping over initialization of 'A'
{
   case 0:
     A j;   // Compiler implicitly calls default constructor
     break;
   case 1:
     break;
}

Это ограничение не ограничено оператором переключения. Это - также ошибка использовать 'goto' для перепрыгивания через инициализацию:

goto LABEL;    // Error jumping over initialization
int j = 0; 
LABEL:
  ;

Немного мелочи - то, что вот в чем разница между C++ и C. В C это не ошибка перепрыгнуть через инициализацию.

, Поскольку другие упомянули, решение состоит в том, чтобы добавить вложенный блок так, чтобы время жизни переменной было ограничено маркировкой отдельного случая.

12
задан mickthompson 23 July 2009 в 22:42
поделиться

2 ответа

Вот кое-что, что поможет вам начать. Вы можете подумать, хотите ли вы, чтобы он был включающим или исключающим в конце и т. Д.

import org.joda.time.*;
import java.util.*;

class LocalDateRange implements Iterable<LocalDate>
{
    private final LocalDate start;
    private final LocalDate end;

    public LocalDateRange(LocalDate start,
                          LocalDate end)
    {
        this.start = start;
        this.end = end;
    }

    public Iterator<LocalDate> iterator()
    {
        return new LocalDateRangeIterator(start, end);
    }

    private static class LocalDateRangeIterator implements Iterator<LocalDate>
    {
        private LocalDate current;
        private final LocalDate end;

        private LocalDateRangeIterator(LocalDate start,
                                       LocalDate end)
        {
            this.current = start;
            this.end = end;
        }

        public boolean hasNext()
        {
            return current != null;
        }

        public LocalDate next()
        {
            if (current == null)
            {
                throw new NoSuchElementException();
            }
            LocalDate ret = current;
            current = current.plusDays(1);
            if (current.compareTo(end) > 0)
            {
                current = null;
            }
            return ret;
        }

        public void remove()
        {
            throw new UnsupportedOperationException();
        }
    }
}

class Test
{
    public static void main(String args[])
    {
        LocalDate start = new LocalDate(2009, 7, 20);
        LocalDate end = new LocalDate(2009, 8, 3);
        for (LocalDate date : new LocalDateRange(start, end))
        {
            System.out.println(date);
        }
    }
}

Я давно не писал итератор на Java, поэтому я надеюсь , что это правильно. Думаю, все в порядке ...

О, для блоков итераторов C #, это все, что я могу сказать ...

28
ответ дан 2 December 2019 в 05:04
поделиться
1
ответ дан 2 December 2019 в 05:04
поделиться
Другие вопросы по тегам:

Похожие вопросы: