Subato

Resource Files

LinkedList Spliterator

In dieser Aufgabe soll nun versucht werden, ein Spliterator für einfach verkettete Listen zu implementieren. Es wird sich herausstellen, dass dieses nicht so optimal geht, wie für die Array basierten Listen.

Gegeben sei folgende Schnittstelle:

package name.panitz.util;

import java.util.Spliterator;
import java.util.stream.Stream;
import java.util.stream.StreamSupport;

public interface Li<A> {
  Spliterator<A> getSpliterator();

  default Stream<A> stream() {
    return StreamSupport.stream(getSpliterator(), false);
  }

  default Stream<A> parallelStream() {
    return StreamSupport.stream(getSpliterator(), true);
  }

}

Implementieren Sie diese Schnittstelle mit Hilfe der Klasse LL für einfach verkettete Liste. Dazu müssen Sie die Methode getSpliterator implementieren. Machen Sie dieses als private innere Klasse. Sie dürfen dabei keine Methode size für die Liste verwenden. Die beiden problematischen Methoden der inneren Spliteratorklasse sind dabei wie folgt umzusetzen:

  • trySplit: Wenn der Spliterator mindesten 5 Elemente hat, dann wird ein neuer Spliterator erzeugt, der über die ersten 4 Elemente des Spliterators läuft. Ansonsten wird null zurück gegeben. 
  • estimateSize: Da für verkettete Listen die Größe auszurechnen sehr aufwändig sein kann, schauen Sie in der Doku, was man in diesem Fall sinnvoller Weise zurück gibt.

package name.panitz.util; import java.util.Spliterator; import java.util.function.Consumer; public class LL<A> implements Li<A> { private A hd; private LL<A> tl; public A head(){ return hd; } public LL<A> tail(){ return tl; } public boolean isEmpty() { return hd == null && tl == null; } public LL(A hd, LL<A> tl) { this.hd = hd; this.tl = tl; } public LL() { this(null, null); } @Override public Spliterator<A> getSpliterator() { return new MySplitter(); } private class MySplitter implements Spliterator<A> { // fill in your solution // Tip: LL.this gets the this Element of the outer class } }
java