迭代器下降和上升的顺序不起作用
问题描述:
我试图实现以下双端队列实现以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);
}
}
}
但如果我尝试用下面的代码来测试它,它进入一个无限循环。发生了什么?编译器不会返回任何类型的错误,我不知道是否正在执行Iterator类的实现。
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
- 您不影响成员的值变量
isDesc
在类DequeIterator
的构造函数中。 - 您无法正确管理方法
DequeIterator#next()
中的索引,您将影响后增加/减少的值,这将以相同的索引结束,从而导致无限循环,直接使用后增加/减少的结果作为索引。
这里是代码固定:
Dequeue<Integer> deque = new Dequeue<>();
deque.insertLast(1);
deque.insertLast(2);
for(Integer i : deque) {
System.out.println(i);
}
和类Dequeue.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++);
}
...
}
因为你永远不插入任何东西放入'result'? – bradimus
你应该迭代'deque'而不是'result' –
另外,'new Integer(1)'是不需要的。 '1'就足够了。 – bradimus