Iterowanie między przedziałem czasu

Dosyć często w aplikacjach wykorzystujemy czas aby ograniczyć dane pomiędzy czasem początkowym i końcowym. W takich sytuacjach czas ma znaczenie drugorzędne. Jednak czasem zdarza się, że konkretna data ma znaczenie pierwszorzędne a to co jest przypisane do czasu jest dodatkiem. W takich sytuacjach, trzeba nieraz wykonywać operacje na kolekcjach dat.

Przy zakresie dat, gdzie zazwyczaj mamy datę początku i końca, przechodzenie po kolejnych elementach trochę się różni od zwykłych iteracji. I co mnie zdziwiło ale nie udało mi się znaleźć gotowej klasy, metody która to wykonuje. Jeśli istnieje to byłbym wdzięczny za informacje.

Ale samodzielne napisanie takiego iteratora nie jest wielkim problemem. Poniższy przykład wykorzystuje bibliotekę joda-time ale nic nie stoi na przeszkodzie aby użyć dowolnych klas odpowiadających za operacje na czasie.

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

public 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();
        }
    }
}

W powyższym kodzie nie ma żadnej magii, zaimplementowanie interejsów Iterable oraz Iterator. Kod pochodzi z tej odpowiedzi.

%d blogerów lubi to: