Iterator über ArrayList

Status
Nicht offen für weitere Antworten.

pun

Mitglied
Hallo,

Ich habe eine ArrayList<Integer> und einen Iterator<Integer> über dieser Liste.
Wenn ich also einen neue Klasse mit der Liste erstelle, bekomme ich wie erwartet schön meine Integer Zahlen ausgegeben, so wie ich das auch erwartet habe.

Wenn ich aber explizit die next() und hasNext() Methoden des Iterators aufrufe, scheint da irgendwas nicht ganz zu stimmen, mein hasNext() liefter immer true, mein next() lieftert immer den selben (ersten Wert) der ArrayList.

Hier mein Iterator (primeList ist die ArrayList<Integer>):
Java:
public Iterator<Integer> iterator() {

        return new Iterator<Integer>() {

            private int k=0;

            public boolean hasNext() {
                return k<primeList.size();
            }

            public Integer next() {
               return primeList.get(k++);
            }

            public void remove() {
                throw new UnsupportedOperationException("not supported");
            }
        };
    }

Wieso liefert mein next() immer nur den ersten Wert der Liste, obwohl der Iterator scheinbar korrekt funktioniert?
 
woher kommt das primeList?

[EDIT] wer lesen kann ist im vorteil...sry =(
[EDIT2] wie wärs mit noch einer Kontrollabfrage:
Java:
public Integer next() {
                return (hasNext() ) ? primeList.get(k++) : null;
            }

[EDIT3] interessieren würde mich auch, wie du den Iterator anwendest

Tomate_Salat
 
Zuletzt bearbeitet von einem Moderator:
Ich mach meine neue Klasse,in der eben dieser Iterator als anonyme Klasse definiert ist:

Klasse k = new Klasse();
dann rufe ich
k.iterator().next() auf, und egal wie oft ich das aufrufe, ich erhalte immer die erste Zahl aus der Liste,
k.iterator().hasNext() liefter immer true :/
 
Mir scheint deine Methode:

Java:
public Iterator<Integer> iterator() {
...
}

sehr sinnfrei. Wieso löst du das ganze nicht einfach so:

Java:
ArrayList<Integer> primeList = new ArrayList<Integer>();
...
Iterator<Integer> iterator  = primeList.iterator();

MFG

Tomate_Salat
 
naja, die Methode remove zB. soll überschrieben werden, da diese durch den Iterator nicht unterstützt werden soll.
 
Ich habe jz noch nicht viel (eigentl. noch garnicht) mit Iteratoren gearbeitet.
Habe mich, wegen deinem Post, auch im Internet (openbook: java ist auch eine Insel) umgeschaut und selber ausprobiert. Aber ich wüsste nicht wie du einen bearbeiteten Iterator einem Array zuweist.

Beim schreiben käme mir jetzt die Idee: du könntest evtl. das erreichen indem du ArrayList ein bisschen bearbeitetst.
Werde ich mal versuchen.

Edit

Versuchs mal damit:

Java:
import java.util.ArrayList;
import java.util.Collection;
import java.util.Iterator;

/**
 * @author Thomas S.
 * @version 1.0
 */
public class MyArrayList extends ArrayList<Integer>{

    private static final long serialVersionUID = 1L;
    private static ArrayList<Integer> list     = new ArrayList<Integer>();
    
    
    @Override
    public void add(int index, Integer element) {
        list.add(index, element);
    }
    
    @Override
    public boolean add(Integer e) {
        return list.add(e);
    }
    
    @Override
    public boolean addAll(Collection<? extends Integer> c) {
        return list.addAll(c);
    }
    
    @Override
    public void clear() {
        list.clear();
    }
    
    @Override
    public Object clone() {
        return list.clone();
    }
    
    @Override
    public Integer get(int index) {
        return list.get(index);
    }
    
    @Override
    public Iterator<Integer> iterator() {
        return it();
    }
    
    private Iterator<Integer> it() {
        final ArrayList<Integer> liste = MyArrayList.list;
        
        return new Iterator<Integer>() {
 
            private int k=0;
 
            public boolean hasNext() {
                return k<liste.size();
            }
 
            public Integer next() {
               return (hasNext()) ? liste.get(k++) : null;
            }
 
            public void remove() {
                throw new UnsupportedOperationException("not supported");
            }
        };
    }
}

ich habe jetzt nicht alle Methoden von ArrayList überschrieben, aber ich denke die wichtigsten sind dabei

kannst du dann etwa so verwenden:

Java:
MyArrayList liste   = new MyArrayList();
        liste.add(12);
        Iterator<Integer> it= liste.iterator();
        it.remove(); // Habs getestet, wirft eine Exception

MFG

Tomate_Salat
 
Zuletzt bearbeitet von einem Moderator:
Tomate_Salat: du extendest eine Liste und verwendest in ihr nochmal ne Liste? Wieso nimmst du nicht die eigentliche liste? Ist sonst ziemlich Sinnfrei

[highlight=java]
package de.test;

import java.util.ArrayList;
import java.util.Iterator;

public class MyList<E> extends ArrayList<E> {
private static final long serialVersionUID = 6260414736583004822L;

@Override
public Iterator<E> iterator() {
return new Iterator<E>() {

Iterator<E> it = listIterator();

@Override
public boolean hasNext() {
return it.hasNext();
}

@Override
public E next() {
return it.next();
}

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

};
}

}

[/highlight]
 
hm also diese Lösung zeigt das gleiche Problem auf....
egal wie oft ich next() aufrufe, ich bekomme immer nur die erste Zahl, aber eben nur wenn ich es explizit aufrufe.
Wenn ich eine foreach Schleife über der iterierten Klasse laufen lasse, geht es..
Kann es sein, dass ich einfach irgendwie dieses next() falsch teste ?
 
bevor du next aufrufst solltest du immer hasNext aufrufen

[highlight=java]
public static void main( String[] args ) {
List<Integer> list = new MyList<Integer>();
list.addAll(Arrays.asList(new Integer[] { 1, 2, 3, 4, 5 }));
Iterator<Integer> it = list.iterator();
while ( it.hasNext() ) {
Integer next = it.next();
System.out.println(next);
}
}
[/highlight]

 
Zuletzt bearbeitet von einem Moderator:
hm okay, dann kann man das nur so in ner schleife laufen lassen,
dachte man könnte einfach mal next() aufrufen und dann springt der Iterator eins weiter.

/e

ok jetzt hab ichs gerafft danke^^
 
Zuletzt bearbeitet:
hm also diese Lösung zeigt das gleiche Problem auf....
egal wie oft ich next() aufrufe, ich bekomme immer nur die erste Zahl, aber eben nur wenn ich es explizit aufrufe.
Wenn ich eine foreach Schleife über der iterierten Klasse laufen lasse, geht es..
Kann es sein, dass ich einfach irgendwie dieses next() falsch teste ?

Wenn du das "explizit" machst, holst du dir doch mit .iterator() jedesmal einen neuen Iterator (siehe deine Methode). Der muss ja dann am Anfang auf das erste Element zeigen.
 
Status
Nicht offen für weitere Antworten.

Zurück
Oben