Iterator cannot refer to a non final...

Maultäschle

Aktives Mitglied
Hey🙂

Hab volgendes Problem, das n kann ich nicht benutzen, da steht dann immer:
cannot refer to the non-final local variable defined in an enclosing scope. Leider darf ich bei der der Methodensignatur nicht das n auch noch auf final setzen.
Wie löse ich das also?
Code:
/**
     * Returns an iterator that enumerates every n-th element in the collection,
     * starting with the first element.
     *
     * @param n
     *            the number of skipped elements+1.
     * @return the iterator.
     * @throws IllegalArgumentException
     *             if n is less than 1.
     */
    @Override
    public Iterator<T> skippingIterator(int n) {
        if (n < 1) {
            throw new IllegalArgumentException();
        } else {
            Iterator<T> it = new Iterator<T>() {
                private int index = 0;
                private int size = list.size() - 1;
               
                @Override
                public T next() {
                    if (!hasNext()) {
                        throw new NoSuchElementException();
                    }
                    int j = index + n;
                    return list.get(j);
                }
               
                @Override
                public boolean hasNext() {

                    return index < size && list.get(index) != null ;
                }


            };

            return it;

        }
    }
 
Naja, wenn du nicht mal final hinzufügen darfst, kannst du einfach einen neuen final int einführen.

(final verändert aber nicht die Signatur, ist das trotzdem explizit verboten?)
 
Du prüfst erst, ob es ein Element an dem Index gibt, dann skipst du den Index? Potentiell gefährlich. xD
 
Aber ich sollte auf die Frage antworten....... Du kriegst den Wert nicht da rein, solange du anonyme innere Klasse verwendest - und wenn du diese nicht verwendest, kannst du sie nicht innerhalb der Methode schreiben.
 
Okay, in Interfaces ist es ja so, dass alle Attribute statisch und final sind, also hab ich jetzt doch zu final gewechselt. Was sind da für Fehler drin?
 
Kann doch nicht so schwer sein:
Java:
    static class ModLinkedList<E> extends LinkedList<E> {
        public Iterator<E> skippingIterator(final int n) {
            final Iterator<E> it = super.iterator();
            return new Iterator<E>() {
                @Override
                public boolean hasNext() {
                    return it.hasNext();
                }
                @Override
                public E next() {
                    E e = it.next();
                    for (int i = 1; i < n; i++) {
                        if (it.hasNext())
                            it.next();
                        else
                            i = n;
                    }
                    return e;
                }
            };
        }
    }

    public static void main(String[] args) {
        ModLinkedList<String> nwmll = new ModLinkedList<>();
        nwmll.add("Hallo");
        nwmll.add("du");
        nwmll.add("da!");

        for (Iterator<String> it = nwmll.skippingIterator(1); it.hasNext();) {
            String next = it.next();
            System.out.println(next);
        }
        System.out.println("");
        for (Iterator<String> it = nwmll.skippingIterator(2); it.hasNext();) {
            String next = it.next();
            System.out.println(next);
        }
    }
 
Dann ist es Rumgeschubse mit i/index.
Aber streng nach der Vorgabe geht es ohne final nicht. 😉
Spreche doch mal deinen Dozenten an, dass seine Aufgabe nicht realisierbar ist. Vorsichtig Umgangston. 🙂

Ach so, dieses nw (Präfix) steht für nicht wichtig. 😉 (Falls sich jemand wundert)
 
Aber streng nach der Vorgabe geht es ohne final nicht. 😉
Spreche doch mal deinen Dozenten an, dass seine Aufgabe nicht realisierbar ist. Vorsichtig Umgangston. 🙂
Du hast aber schon den Thread verfolgt und gemerkt, dass final nicht das Problem ist?


@Maultäschle: Dein Problem ist der index, den du nie veränderst. Wenn das geändert ist, solltest du noch mal an hasNext arbeiten 😉
 
Orientieren kann er sich ja daran, cursor = i + 1;[ steht da z. B., das ist ein wichtiger Hinweis.
 
Zuletzt bearbeitet von einem Moderator:

Neue Themen


Zurück
Oben