将元素添加到 Java 不可变队列
Adding an element to a Java immutable queue
我希望有人能帮助我解决我的小问题。
我以这种方式定义了我的 EmptyQueue 和 NotEmptyQueue,遵循我的接口 Immutable 队列。主要问题是应该向 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);
这是像您一样处理持久队列的常用方法。
我希望有人能帮助我解决我的小问题。 我以这种方式定义了我的 EmptyQueue 和 NotEmptyQueue,遵循我的接口 Immutable 队列。主要问题是应该向 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);
这是像您一样处理持久队列的常用方法。