2016-07-15 7 views
0

Ich versuchte, dies auszuarbeiten, konnte aber nicht.wie auf jedes zweite Element in Java iterieren

Ich brauche eine Klasse zu implementieren, die Iterator implementiert und nimmt Iterator als Konstruktorparameter,

1) Sie benötigen jeden 2. hasNext

2) zurückgeben müssen Grundsätzlich ist jedes zweite nächste Element zurückzukehren

Ich versuche, gegebenen Iterator zu benutzen, der vom Konstruktor erhalten wird, aber wenn ich nächstes Element auf hasnext verwende, erhöhe ich den Iterator tatsächlich um ein Element. Das Problem tritt auf, wenn ich unabhängig auf hasNext oder next Element zugreife und nicht alle Testfälle überlasse. Jede Lösung oder Idee zu diesem

Vorlage und meine erwartete Umsetzung sieht aus wie folgt:

public class AlternateIterator<T> implements Iterator<T> 
public AlternateIterator(Iterator<T> target) 

public boolean hasNext() { 
     boolean returnvalue = false; 
       if(iterator.hasNext()) { 
        iterator.next(); 
        returnvalue = iterator.hasNext(); 
       } 
       return returnvalue; 

    } 

    @Override 
    public T next() { 
     T object = null; 
     if(iterator.hasNext()) { 
     object = iterator.next(); 
     return object; 
     } 
     else 
      return null; 

- gegangen durch diesen Link aber es schafft eine neue Implementierung selbst, während ich will nur die angegebene Vorlage verwenden:

Can we write our own iterator in Java?

+0

einer for-Schleife und einige ((i & 1) == 1) sollte es tun, tun Sie wirklich brauche ich einen Iterator? –

+0

können Sie einige bedingte Verzweigung innerhalb der Schleife setzen – kpie

+0

Ich stimme nicht nahe, um die Frage nicht zu schließen, aber es gibt http://stackoverflow.com/questions/16033711/java-iterating-over-every-two-elements- in-a-list –

Antwort

1

verfolgen, ob Sie das Element aus der Quelle Iterator übersprungen haben oder nicht, wie folgt aus:

import java.util.Iterator; 
import java.util.NoSuchElementException; 
import java.util.Objects; 

final class AlternateIterator<T> 
    implements Iterator<T> 
{ 

    static <T> Iterable<T> alternate(Iterable<T> original) 
    { 
    return() -> new AlternateIterator<>(original.iterator()); 
    } 

    private final Iterator<T> source; 

    private boolean skipped; 

    AlternateIterator(Iterator<T> source) 
    { 
    this.source = Objects.requireNonNull(source); 
    } 

    @Override 
    public boolean hasNext() 
    { 
    if (!skipped) { 
     if (source.hasNext()) 
     source.next(); 
     skipped = true; 
    } 
    return source.hasNext(); 
    } 

    @Override 
    public T next() 
    { 
    if (hasNext()) { 
     skipped = false; 
     return source.next(); 
    } 
    throw new NoSuchElementException(); 
    } 

    @Override 
    public void remove() 
    { 
    source.remove(); 
    } 

} 
+0

Hervorragend, Mann, du bist super .. gerettet mein Tag, bitte bring mir bei, wie man programmiert .. Danke viel :) –

0

Ihr Problem ist, dass hasNext() den Zustand des dekorierten Iterator ändert. Sie benötigen eine Elementvariable wie skipped, um den Status zu verfolgen, sodass hasNext() nicht doppelt vorläuft und zwei überspringt, und Ihre Implementierung von next() sollte this.hasNext(), nicht iterator.hasNext() verwenden.

Edit: es etwa so aussehen werde:

public class AlternateIterator<T> implements Iterator<T> { 
    public AlternateIterator(Iterator<T> target) { ... } 

    private volatile boolean skipped = false; 

    public boolean hasNext() { 
     if (!skipped) { 
      skipped = true; 
      if (iterator.hasNext()) { 
       iterator.next(); 
      } 
     } 
     return iterator.hasNext(); 
    } 

    @Override 
    public T next() { 
     hasNext(); 
     skipped = false; 
     return iterator.next(); 
    } 
} 
+0

Danke für das Schauen, es sieht vielversprechend aus, lassen Sie mich dies einmal versuchen .. –

+0

Sie können 'next()' aufrufen, ohne 'hasNext()' zuerst aufzurufen. Ihre Implementierung wird in diesem Fall keine Elemente überspringen. – erickson

+0

Korrigiert. Guter Fang. –

0

Sie benötigen einen boolean Mitglied haben, die gespeichert werden, wenn hasNext hat sich seit dem letzten Aufruf des nächsten aufgerufen wurde. Auf diese Weise wissen Sie, ob Sie eine zusätzliche nächste oder nicht in beiden Methoden aufrufen müssen.

+0

Danke für die Antwort, es sieht vielversprechend aus –

Verwandte Themen