2016-12-15 3 views
0

J'espère que quelqu'un pourra m'aider avec mon petit problème. J'ai défini mon EmptyQueue et mon NotEmptyQueue de cette manière, en suivant ma file d'attente immutable de l'interface. Le principal problème c'est que la méthode enQueue, qui devrait ajouter un élément à myQueue ne fonctionne pas. Pls me aider:Ajout d'un élément à une file d'attente immutable Java

Interface:

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

Comment est-ce immuable si vous pouvez y ajouter des éléments? – Kayaman

+0

Vous ne pouvez pas ajouter à une file d'attente immutable, par définition. Une file d'attente immuable semble plutôt inutile, puisque vous ne pouvez pas non plus la consommer. – chrylis

+0

@Kayaman Crée un nouvel objet avec l'élément ajouté. – Bubletan

Répondre

1
myQueue.enQueue(9); 

devrait être

myQueue = myQueue.enQueue(9); 

C'est la manière habituelle de traiter une file d'attente persistante comme vous l'avez fait.

+0

Je t'aime. Merci beaucoup!!!! – Nikita