具有降序和升序的迭代器不起作用
Iterator with descending and ascending order does not work
我正在尝试实现以下实现 Iterable 的双端队列:
public class Dequeue<E> implements Iterable<E> {
protected List<E> deque;
public Dequeue() {
this.deque = new ArrayList<>();
}
public void insertFirst( E elem ) {
this.deque.add( 0, elem );
}
public void insertLast( E elem ) {
this.deque.add( elem );
}
public E removeFirst() {
return (this.deque.isEmpty()) ? null : this.deque.remove(0);
}
public E removeLast() {
return (this.deque.isEmpty()) ? null : this.deque.remove( this.deque.size() - 1 );
}
public E examineFirst() {
return this.deque.get(0);
}
public E examineLast() {
return this.deque.get( this.deque.size() - 1 );
}
@Override
public Iterator<E> iterator() {
return new DequeIterator<>(false);
}
public Iterator<E> iterator( boolean isDesc ) {
return new DequeIterator<>(isDesc);
}
public class DequeIterator<E> implements Iterator<E> {
private int index;
private boolean isDesc;
public DequeIterator( boolean isdesc ) {
this.index = isdesc ? deque.size() - 1 : 0;
}
@Override
public boolean hasNext() {
return isDesc ? index > 0 : index < deque.size();
}
@Override
public E next() {
this.index = (isDesc) ? index-- : index++;
return (E) deque.get(index);
}
@Override
public void remove() {
deque.remove(index);
}
}
}
但是如果我尝试用下面的代码测试它,它就会进入无限循环。发生了什么?编译器没有 return 任何类型的错误,我不知道我是否正在执行 Iterator class 正确的实现。
List<Integer> result = new ArrayList<>();
Dequeue<Integer> deque = new Dequeue<>();
deque.insertLast( new Integer(1) );
deque.insertLast( new Integer(2) );
for( Integer i : deque ) {
System.out.println(i);
}
你的代码实际上有3
个错误:
- 您不会遍历
deque
,而是遍历无用的列表 result
- 您不影响 class
DequeIterator
. 的构造函数中的成员变量 isDesc
的值
- 您没有正确管理方法
DequeIterator#next()
中的索引,您影响了 post incrementation/decrementation 的值,这将以相同的索引结束,因此无限循环,直接使用 post incrementation/decrementation 的结果作为 index.
固定代码如下:
Dequeue<Integer> deque = new Dequeue<>();
deque.insertLast(1);
deque.insertLast(2);
for( Integer i : deque ) {
System.out.println(i);
}
和classDequeue.DequeIterator
public class DequeIterator<E> implements Iterator<E> {
...
private boolean isDesc;
public DequeIterator( boolean isdesc ) {
...
this.isDesc = isdesc;
}
...
@Override
public E next() {
return (E) deque.get(isDesc ? index-- : index++);
}
...
}
我正在尝试实现以下实现 Iterable 的双端队列:
public class Dequeue<E> implements Iterable<E> {
protected List<E> deque;
public Dequeue() {
this.deque = new ArrayList<>();
}
public void insertFirst( E elem ) {
this.deque.add( 0, elem );
}
public void insertLast( E elem ) {
this.deque.add( elem );
}
public E removeFirst() {
return (this.deque.isEmpty()) ? null : this.deque.remove(0);
}
public E removeLast() {
return (this.deque.isEmpty()) ? null : this.deque.remove( this.deque.size() - 1 );
}
public E examineFirst() {
return this.deque.get(0);
}
public E examineLast() {
return this.deque.get( this.deque.size() - 1 );
}
@Override
public Iterator<E> iterator() {
return new DequeIterator<>(false);
}
public Iterator<E> iterator( boolean isDesc ) {
return new DequeIterator<>(isDesc);
}
public class DequeIterator<E> implements Iterator<E> {
private int index;
private boolean isDesc;
public DequeIterator( boolean isdesc ) {
this.index = isdesc ? deque.size() - 1 : 0;
}
@Override
public boolean hasNext() {
return isDesc ? index > 0 : index < deque.size();
}
@Override
public E next() {
this.index = (isDesc) ? index-- : index++;
return (E) deque.get(index);
}
@Override
public void remove() {
deque.remove(index);
}
}
}
但是如果我尝试用下面的代码测试它,它就会进入无限循环。发生了什么?编译器没有 return 任何类型的错误,我不知道我是否正在执行 Iterator class 正确的实现。
List<Integer> result = new ArrayList<>();
Dequeue<Integer> deque = new Dequeue<>();
deque.insertLast( new Integer(1) );
deque.insertLast( new Integer(2) );
for( Integer i : deque ) {
System.out.println(i);
}
你的代码实际上有3
个错误:
- 您不会遍历
deque
,而是遍历无用的列表result
- 您不影响 class
DequeIterator
. 的构造函数中的成员变量 - 您没有正确管理方法
DequeIterator#next()
中的索引,您影响了 post incrementation/decrementation 的值,这将以相同的索引结束,因此无限循环,直接使用 post incrementation/decrementation 的结果作为 index.
isDesc
的值
固定代码如下:
Dequeue<Integer> deque = new Dequeue<>();
deque.insertLast(1);
deque.insertLast(2);
for( Integer i : deque ) {
System.out.println(i);
}
和classDequeue.DequeIterator
public class DequeIterator<E> implements Iterator<E> {
...
private boolean isDesc;
public DequeIterator( boolean isdesc ) {
...
this.isDesc = isdesc;
}
...
@Override
public E next() {
return (E) deque.get(isDesc ? index-- : index++);
}
...
}