Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- import java.io.Serializable;
- import java.util.*;
- import java.util.function.Function;
- public class Foo<E> implements Deque<E>, Serializable {
- private static final long serialVersionUID = 0L;
- private final Node sentinel = sentinelInit();
- private final Iterable<Node> nodes = (Iterable<Node> & Serializable) () -> new Iterator<Node>() {
- @SuppressWarnings("UnusedDeclaration")
- private static final long serialVersionUID = 0L;
- private Node next = sentinel.next;
- @Override
- public boolean hasNext() {
- return next != sentinel;
- }
- @Override
- public Node next() {
- if (!hasNext()) {
- throw new NoSuchElementException();
- }
- Node old = next;
- next = next.next;
- return old;
- }
- @Override
- public void remove() {
- if (next.previous == sentinel) {
- throw new IllegalStateException();
- }
- removeNode(next.previous);
- }
- };
- @Override
- public boolean isEmpty() {
- return false;
- }
- @Override
- public Object[] toArray() {
- return new Object[0];
- }
- @Override
- public <T> T[] toArray(T[] a) {
- return null;
- }
- @Override
- public boolean containsAll(Collection<?> c) {
- return false;
- }
- @Override
- public boolean removeAll(Collection<?> c) {
- return false;
- }
- @Override
- public boolean retainAll(Collection<?> c) {
- return false;
- }
- @Override
- public void clear() {
- }
- @Override
- public void addFirst(E e) {
- }
- @Override
- public void addLast(E e) {
- }
- @Override
- public boolean offerLast(E e) {
- return false;
- }
- @Override
- public E removeFirst() {
- return null;
- }
- @Override
- public E removeLast() {
- return null;
- }
- @Override
- public E pollFirst() {
- return null;
- }
- @Override
- public E getFirst() {
- return null;
- }
- @Override
- public E getLast() {
- return null;
- }
- @Override
- public E peekFirst() {
- return null;
- }
- @Override
- public boolean removeFirstOccurrence(Object o) {
- return false;
- }
- @Override
- public boolean removeLastOccurrence(Object o) {
- return false;
- }
- @Override
- public E remove() {
- return null;
- }
- @Override
- public E element() {
- return null;
- }
- @Override
- public void push(E e) {
- }
- @Override
- public E pop() {
- return null;
- }
- @Override
- public boolean contains(Object o) {
- return false;
- }
- @Override
- public boolean offerFirst(E e) {
- return false;
- }
- @Override
- public E pollLast() {
- return null;
- }
- @Override
- public E peekLast() {
- return null;
- }
- @Override
- public boolean offer(E e) {
- Node node = new Node(e);
- sentinel.previous.next = node;
- node.previous = sentinel.previous;
- sentinel.previous = node;
- node.next = sentinel;
- return true;
- }
- @Override
- public E poll() {
- return null;
- }
- @Override
- public E peek() {
- return null;
- }
- @Override
- public boolean remove(Object o) {
- for (Node node : nodes) {
- if (node.value.equals(o)) {
- removeNode(node);
- return true;
- }
- }
- return false;
- }
- @Override
- public int size() {
- return 0;
- }
- @Override
- public Iterator<E> descendingIterator() {
- return null;
- }
- @Override
- public Iterator<E> iterator() {
- return new Iterator<E>() {
- private final Iterator<Node> backingIter = nodes.iterator();
- @Override
- public boolean hasNext() {
- return backingIter.hasNext();
- }
- @Override
- public E next() {
- return backingIter.next().value;
- }
- @Override
- public void remove() {
- backingIter.remove();
- }
- };
- }
- private Node sentinelInit() {
- Node sentinel = new Node();
- sentinel.next = sentinel;
- sentinel.previous = sentinel;
- return sentinel;
- }
- private void removeNode(Node node) {
- node.previous.next = node.next;
- node.next.previous = node.previous;
- }
- private class Node implements Serializable {
- private static final long serialVersionUID = 0L;
- public E value;
- public Node next;
- public Node previous;
- public Node(E value) {
- this.value = value;
- }
- public Node() {
- this(null);
- }
- }
- public static <I, O> List<O> map(Function<? super I, O> function, Iterable<I> objects) {
- ArrayList<O> returned = new ArrayList<>();
- for (I obj : objects) {
- returned.add(function.apply(obj));
- }
- return returned;
- }
- @Override
- public boolean addAll(Collection<? extends E> c) {
- boolean ret = false;
- for (boolean changed : map(this::add, c)) {
- if (changed) {
- ret = true;
- }
- }
- return ret;
- }
- @Override
- public boolean add(E e) {
- if (!offer(e)) {
- throw new IllegalStateException();
- }
- return true;
- }
- public static void main(String[] args) {
- Foo<String> list = new Foo<>();
- System.out.println("Constructed list");
- list.addAll(Arrays.asList("a", "B", "c"));
- System.out.println("Added a, B and c.");
- list.forEach(System.out::println);
- list.remove("B");
- list.forEach(System.out::println);
- }
- }
- C:IdeaJava8FoooutproductionFoofoo>"C:Program FilesJavajdk1.8.0_20binjavap.exe" Foo$1.class
- Compiled from "Foo.java"
- class foo.Foo$1 implements java.util.Iterator<foo.Foo<E>.Node> {
- final foo.Foo this$0;
- foo.Foo$1(foo.Foo);
- public boolean hasNext();
- public foo.Foo<E>.Node next();
- public void remove();
- }
- public java.lang.Object next();
- private final Iterable<Node> nodes = (Iterable<Node> & Serializable) () -> new Iterator<Node>() {
- @SuppressWarnings("UnusedDeclaration")
- private static final long serialVersionUID = 0L;
- private Node snext = sentinel.next; // refactor `next` to `snext`
- ...
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement