2017-10-29 6 views
-1

Ich versuche, eine Iterator-Klasse zu erstellen, die ergänzt, was ich dachte, wäre zwei einfache Methoden, aber ich habe Probleme, ich schaffe die Erstellung des Iterators. Die Zeile, in der ich den Iterator erstelle, gibt mir einen Kompilierfehler, der sagt: "Iterator ist abstrakt; kann nicht instanziiert werden". Ich bin mir nicht sicher, was das bedeutet, aber offensichtlich habe ich etwas falsch gemacht. Auch ich lege den Zweck der Methoden über ihnen, wenn Sie irgendetwas falsch mit ihnen sehen, lassen Sie mich wissen. Danke für jede Eingabe!Problem beim Erstellen von Iterator in Java

import java.util.Iterator; 
private class OrderedListIterator{ 
    Iterator<E> it = new Iterator<E>(); 

    //return true if iterator has more items 
    public boolean hasNext(){ 
    boolean found = false; 
    if(it.hasNext == true) 
     found = true; 
     return found; 
    return found;  
    } 

    //return next item in the iterator 
    public E getNext(){ 
    if(it.hasNext != false) 
     return it.next; 
    } 

    //prints out message 
    public void remove(){ 
     System.out.println("Operation not supported"); 
    } 
} 
+0

Worauf warten Sie, dass es iteriert? –

+0

Ja, Sie können kein Objekt einer Klasse erstellen, wenn es sich um eine abstrakte oder eine Interface-Klasse handelt. Aber Sie können sie entsprechend erweitern oder implementieren. Dieses Thema hilft mir, https://stackoverflow.com/questions/5849154/can-we-write-our-own-iterator-in-java – mrgenco

+0

@AndyTurner verknüpfte Liste –

Antwort

1

Der Grund, warum Sie diesen Fehler erhalten, ist, weil ein Iterator eine Schnittstelle ist.

In der Java-Programmiersprache ist eine Schnittstelle, ein Referenztyp, ähnlich zu einer Klasse, die nur Konstanten, Methode Signaturen, Standardmethoden, statische Methoden und verschachtelte Typen enthalten kann. Methode Körper existieren nur für Standardmethoden und statische Methoden. Schnittstellen können nicht instanziiert werden - sie können nur durch Klassen implementiert werden oder durch andere Schnittstellen erweitert werden. Erweiterung wird später in dieser Lektion diskutiert.

aus der Java-Dokumentation enthält https://docs.oracle.com/javase/tutorial/java/IandI/createinterface.html

Eine Schnittstelle, die Definition der Methoden, nicht die Durchführung und die ist, warum Sie nicht erstellen oder Schnittstellen aufrufen oder es Methoden. Die Iterator-Schnittstelle hat zwei Methoden; hasNext() und next(). Ihr Code sieht so aus, als wollten Sie die Iterator-Schnittstelle implementieren.

private class OrderedListIterator implements Iterator<E> 

In Ihrem hasNext und nächste Methoden, müssen Sie über Ihre OrderedList iterieren je nachdem, wie Sie es umgesetzt haben.

Hier ist ein Beispiel für einen Iterator für eine ArrayList, die ich zuvor erstellt habe.

private class ArrayIterator implements Iterator<E> { 
    private int arrayIndex = 0; 

    /** 
    * Checks if the set has a next value. 
    * 
    * @return true if there is a next value, else false 
    */ 
    public boolean hasNext() { 
     //Checks that the index is within the size of the ArrayList 
     return arrayIndex < size; 
    } 

    /** 
    * Gets the next value in the iteration. 
    * 
    * @return 
    *  The next value in the list 
    * @throws NoSuchElementException 
    *  if there is no next element in the list 
    */ 
    public E next() throws NoSuchElementException { 
     if (arrayIndex == size) { 
      throw new NoSuchElementException(); 
     } 
     //Checks the ArrayList's data at the current index 
     return data[arrayIndex++]; 
    } 
} 

Ihre private Klasse ist in der Lage, die Felder zugreifen es Klasse Umgebung ist. In meinem Beispiel speichert der Iterator einen Index (wie einen internen Cursor) im Array und prüft die Daten der ArrayList am aktuellen Index. Jedes Mal, wenn die nächste Methode aufgerufen wird, wird der Index für die nächste Zeit erhöht.

Wenn Ihre OrderedList-Klasse wie eine LinkedList ist und Knoten enthält, würden Sie einen Verweis auf den Knoten speichern und jedes Mal, wenn die nächste Methode aufgerufen wird, den Knoten zurückgeben und den Cursor zum nächsten Knoten ändern.

Verwandte Themen