Witam ponownie!
Cały weekend starałem się ogarnąć klasę filtrującą, ale nadal mam problem(nie jestem bardzo zaawansowany w javie, kompletnie olałem podstawy i teraz na kolejnym semestrze ponoszę tego odpowiedzialność) ;)
Mianowicie:
enum HasNextState {
NotComputed, NoNext, HasNext
}
class FiltrPierwszej implements Iterable<Integer> {
final IteratorPrzechodzacy range;
public FiltrPierwszej(IteratorPrzechodzacy range) {
this.range = range;
}
public Iterator<Integer> iterator() {
return new Iterator<Integer>() {
HasNextState state = HasNextState.NotComputed;
Integer next = null;
Iterator<Integer> underlyingIterator = range.iterator();
public boolean hasNext() {
if (state == HasNextState.NotComputed)
{
state = HasNextState.NoNext;
while (underlyingIterator.hasNext())
{
Integer toCheck = underlyingIterator.next();
if (Warunek.isPrime(toCheck))
{
next = toCheck;
state = HasNextState.HasNext;
break;
}
}
}
return state == HasNextState.HasNext;
}
public Integer next() {
if (state == HasNextState.NoNext) {
throw new IndexOutOfBoundsException();
}
if (state == HasNextState.NotComputed) {
hasNext();
}
state = HasNextState.NotComputed;
return next;
}
public void remove() {
throw new UnsupportedOperationException();
}
};
}
}
Czy mógłbyś mi trochę opisać tą klasę. Dokładnie chodzi mi o metodę hasNext() - bo zakladam ze jest ona sprawdzającą, czy następny element jest liczbą pierwszą.
Rzecz jasna program działa i bardzo za niego dziękuje, ale java zaczyna mi się podobać i chciałbym trochę zgłebić wiedzę na temat iteratorów, bo wydają się być straszne zagmatwane.
Sam starałem się zrobić całość na generatorze, generatorze filtrującym(do którego byłby dołączony predykat w postaci sprawdzana czy następny element jest akceptowalny). Jednak taki zamieszany program, wywalał mi wiecznie błąd odnoszący się do niekompatybilności typu gdy próbowałem utworzyć obiekt klasy Generator, ktory były obiektem Generatora filtrujacego o parametrach(generator, predykat).
Wiem że zamieszane, ale ja zazwyczaj robie programy na około ;)