Java Iterator

opus31337

Grünschnabel
Hallo!

Ich habe ein Problem beim Erstellen eines Iterators in Java. Ich möchte mithilfe dieses Iterators durch Elemente meiner selbstgeschriebenen verketteten Liste durchgehen. Variable head ist das Erste Element der Datenstruktur. Das Letzte Element zeigt auf null.

Code:
public class LinkedList<V> implements Iterable {

	private LinkedListEntry head = null;
...

private class LinkedListEntry {
		private int key;
		private V value;
		private LinkedListEntry next = null;
}

@Override
	 public Iterator iterator(){
	       return new Iterator() { 
	          private LinkedListEntry Entry = head;
	           
	           public boolean hasNext() { 
	        	   return (Entry.getNext()!=null);
	        	   }
	           
	           public V next() {
	        		  Entry = Entry.getNext();
	              return Entry.getValue();
	           }
	           
	           public void remove() {
	               throw new UnsupportedOperationException();
	           
	           }
	           
	       };
	   }

}

Ich habe im Internet tonnenweise Tutorials zum Thema gefunden. Allerdings alle sie sprechen von Datensturkturen, bei denen über Indizes iteriert wird. D.h. beim Erstellen des Iterators wird ein Index = -1 gesetzt. Selbstverständlich Aufruf der Methode next() liefert den Index 0, was dem ersten Element der Datenstruktur entspricht...

Und da fangen meine Probleme an:

Da Ich in meiner Liste keinen Index hab und nur head als Anfangselement, wird der erste Aufruf von next() nicht mein Anfangselement, sondern seinen Nachfolger liefern... Wie geht man mit sowas um? Kann ich nach der Erstellung eines Iterators direkt auf das erste Element zugreifen(ohne next() aufzurufen)?

Ich würde gerne später einfach sowas benutzen können

Code:
LinkedList<String> list = new LinkedList<String>();
...

for (String s : list) {
    System.out.println(s);
}
 

benhaze

Mitglied Platinum
meiner selbstgeschriebenen verketteten Liste
Wie liegen denn die Daten in dieser Klasse vor?
Man iteriert ja immer irgendwie über eine Liste oder Array.
Diese sollte schon auch in irgendeiner Art vorhanden sein.

Deine Liste scheint nur ein Element zu beinhalten:
LinkedListEntry
Wie ist dieses Implementiert?
Wie kommt der Bezug zu next()-Element zustande?

Was ist an deiner List-Implementation anders als an einer handelsüblichen ArrayList oder LinkedList?
Oder anders: was soll deine List-Impl anders machen als die bereits vorhandene Arraylist/LinkedList?
 
Zuletzt bearbeitet:

d4rkY89

Mitglied
Im Prinzip ist dein Code schon fast richtig. Du hast dir eigentlich nur deine Variable "Entry" von der Bedeutung her falsch definiert.
Ich habe sie mal in "nextEntry" umbenannt um es deutlich zu machen. So sollte der Code jetzt laufen (hab es allerdings nicht testen können, da ja nicht der ganze Code von dir dabei war).

Java:
@Override
public Iterator iterator(){
    return new Iterator() {
        private LinkedListEntry nextEntry = head;

        public boolean hasNext() { 
            return (nextEntry != null);
        }

        public V next() {
            V returnValue = nextEntry;
            nextEntry = nextEntry.getNext();
            return returnValue;
        }

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

Gruß darky
 
Zuletzt bearbeitet: