Iterator schaltet nicht weiter?!

DonMarcoHH

Aktives Mitglied
Moin,

ich hab jetzt schon mehrfach das gleiche Problem und verstehe nicht warum, bisher konnte ich es aber umgehen.
Der folgende Javacode, sollte ja eigentlich jeweils den nächsten Eintrag einer Liste liefern;
Java:
List<String> liste = new LinkedList<String>();
String text = "";
while (liste.hasNext()){
    text = liste.next();
}

Wieso funktioniert das nicht? Konkret habe ich das im folgenden Codebeispiel, wo er mir immer und immer wieder den ersten Listeneintrag liefert:
Java:
    private Set<String> findType(String line,
            Set<String> initSet, Set<String> keySet){
        String key;
        while (initSet.iterator().hasNext()){
            if (line.matches(key = initSet.iterator().next())){
                keySet.add(key);
            } //if-else
        } //while    
        return keySet;
    } //findType
 
Zuletzt bearbeitet:
Denksport-Hinweis:
angenommen er würde auf diese Weise weiterschalten,
auf welchem Wege würdest du dann ein Set zweimal hintereinander durchlaufen?
 
Das ist jetzt nur geraten, aber ich denke, dass liegt daran, dass er dir immer und immer wieder einen neuen Iterator gibt und der fängt logischerweise wieder beim ersten Eintrag an.

Holt dir am Anfang einfach ein Iterator Objekt
Java:
Iterator it = initSet.iterator();
(Ob der Code 100% stimmt weiß ich nicht, ich arbeite nicht so oft mit Iteratoren. Wahlweise nochmal nachschlagen wie man sich den genau holt)
Und dann arbeitest du einfach mit dem Iterator-Objekt "it" weiter
Also
Java:
while(it.hasNext()){
//was auch immer getan werden soll
}
 
Zuletzt bearbeitet von einem Moderator:
1. liste.hasNext())... das hat kein hasNext... du meinst wahrscheinlich liste.iterator().hasNext().
warum geht das nicht? weil iterator immer einen neuen iterator erzeugt, der am anfang steht...

so gehts

Java:
      List<String> liste = new LinkedList<String>();
      liste.add("a");
      liste.add("b");
      String text = "";
      Iterator<String> it = liste.iterator();
      while (it.hasNext()){
          text = it.next();
          System.out.println(text);
      }
 
Noch als Ergänzung:

Anstatt einer while-Schleife sollte man in Bezug auf einen Iterator eine for-Schleife benutzen:
Java:
List<String> l = ...
for (Iterator<String> i = l.iterator(); i.hasNext();) {
  String s = i.next();
}
Das hat den Vorteil, dass wenn du mehrmals über eine Liste iterierst du nicht aus Versehen wieder den gleichen Iterator benutzt:
Java:
Iterator i = ...
while (i.hasNext())

Iterator i2 = ...
while (i.hasNext) // aua

Statt den Iterator manuell zu erzeugen kannst du aber auch die foreach-Schleife benutzen:
Java:
List<String> l = ...
for (String s : l) {
  // use s
}
Dann kannst du einen Fehler wie jedes mal einen neuen Iterator zu erzeugen gar nicht mehr machen.
 

Zurück
Oben