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>):
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 :/
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:
importjava.util.ArrayList;importjava.util.Collection;importjava.util.Iterator;/**
* @author Thomas S.
* @version 1.0
*/publicclassMyArrayListextendsArrayList<Integer>{privatestaticfinallong serialVersionUID =1L;privatestaticArrayList<Integer> list =newArrayList<Integer>();@Overridepublicvoidadd(int index,Integer element){
list.add(index, element);}@Overridepublicbooleanadd(Integer e){return list.add(e);}@OverridepublicbooleanaddAll(Collection<?extendsInteger> c){return list.addAll(c);}@Overridepublicvoidclear(){
list.clear();}@OverridepublicObjectclone(){return list.clone();}@OverridepublicIntegerget(int index){return list.get(index);}@OverridepublicIterator<Integer>iterator(){returnit();}privateIterator<Integer>it(){finalArrayList<Integer> liste =MyArrayList.list;returnnewIterator<Integer>(){privateint k=0;publicbooleanhasNext(){return k<liste.size();}publicIntegernext(){return(hasNext())? liste.get(k++):null;}publicvoidremove(){thrownewUnsupportedOperationException("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 =newMyArrayList();
liste.add(12);Iterator<Integer> it= liste.iterator();
it.remove();// Habs getestet, wirft eine Exception
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 ?
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.
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.