2016-12-15 39 views
0

我希望有人可以帮我解决我的小问题。 我以这种方式定义了我的EmptyQueue和我的NotEmptyQueue,跟随着我的接口Immutable队列。主要的问题是,方法enQueue,应该添加一个元素到myQueue不起作用。请帮助我:将元素添加到Java不可变队列

接口:

public interface ImmutableQueue<E> extends Iterable<E> { 
    boolean isEmpty(); 
    int size(); 
    ImmutableQueue<E> enQueue(E e); 
    ImmutableQueue<E> deQueue(); 
    E getTop(); 
} 

EmptyQueue:

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

public class EmptyQueue<E> implements ImmutableQueue <E>, Iterable <E> { 

    @Override 
    public boolean isEmpty() { 
     return true; 
    } 

    @Override 
    public int size() { 
     return 0; 
    } 

    @Override 
    public ImmutableQueue<E> enQueue(E e) { 
     NotEmptyQueue<E> q= new NotEmptyQueue <>(e,this); 
     return q; 
    } 

    @Override 
    public ImmutableQueue<E> deQueue() { 
     throw new NoSuchElementException(); 
    } 

    @Override 
    public E getTop() { 
     throw new NoSuchElementException(); 
    } 

    @Override 
    public Iterator<E> iterator() { 
     return new Iterator<E>(){ 

      @Override 
      public boolean hasNext() { 
       return false; 
      } 

      @Override 
      public E next() { 
       throw new NoSuchElementException(); 
      } 

     }; 
    } 
} 

NotEmptyQueue:

import java.util.Iterator; 

public class NotEmptyQueue<E> implements ImmutableQueue<E>, Iterable <E>{ 

    public E e; 
    public ImmutableQueue<E> tail; 

    public NotEmptyQueue(E e, ImmutableQueue<E> tail){ 
     this.e = e; 
     this.tail = tail; 
    } 


    @Override 
    public boolean isEmpty() { 
     return false; 
    } 

    @Override 
    public int size() { 
     return tail.size() + 1; 
    } 

    @Override 
    public ImmutableQueue<E> enQueue(E e) { 
     return new NotEmptyQueue<>(e,this); 
    } 

    @Override 
    public ImmutableQueue<E> deQueue() { 
     return tail; 
    } 
    @Override 
    public E getTop(){ 
     return e; 
    } 

    public static void main (String [] args){ 
     NotEmptyQueue<Integer> myQueue= new NotEmptyQueue<>(new Integer(1),null); 
     myQueue.enQueue(9); 
     myQueue.enQueue(7); 
     System.out.println(myQueue.size()); 
     System.out.println(myQueue.getTop()); 
     for(Integer i : myQueue){ 
      System.out.println(i); 
     } 

    } 



    @Override 
    public Iterator<E> iterator() { 
     return new Iterator<E>(){ 
      ImmutableQueue<E> queue; 
      @Override 
      public boolean hasNext() { 
       return (!tail.isEmpty()); 
      } 

      @Override 
      public E next() { 
       E res = queue.getTop(); 
       queue = queue.deQueue(); 
       return res; 
      } 

      Iterator<E> setQueue(ImmutableQueue<E> queue){ 
       this.queue = queue; 
       return this; 
      } 

     }.setQueue(this); 
    } 

} 
+3

如果您可以添加元素,它如何不可变? – Kayaman

+0

按照定义,您不能添加到不可变队列中。不可变队列看起来很没用,因为你也不能使用它。 – chrylis

+0

@Kayaman它使用添加的元素创建一个新对象。 – Bubletan

回答

1
myQueue.enQueue(9); 

应该

myQueue = myQueue.enQueue(9); 

这是处理像你一样的持续队列的常用方法。

+0

我爱你。非常感谢!!!! – Nikita