簡體   English   中英

將元素添加到Java不可變隊列

[英]Adding an element to a Java immutable queue

我希望有人可以幫助我解決我的小問題。 我按照接口Immutable隊列的這種方式定義了EmptyQueue和NotEmptyQueue。 主要問題在於應該向myQueue中添加元素的enQueue方法無法正常工作。 請幫助我:

接口:

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

空隊列:

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);
    }

}
myQueue.enQueue(9);

應該

myQueue = myQueue.enQueue(9);

這是處理像您這樣的持久隊列的常用方法。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM