迭代器下降和上升的顺序不起作用

迭代器下降和上升的顺序不起作用

问题描述:

我试图实现以下双端队列实现以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); 
} 
+1

因为你永远不插入任何东西放入'result'? – bradimus

+1

你应该迭代'deque'而不是'result' –

+2

另外,'new Integer(1)'是不需要的。 '1'就足够了。 – bradimus

实际上有3错误在你的代码:

  1. 你不遍历deque但在没用的列表result
  2. 您不影响成员的值变量isDesc在类DequeIterator的构造函数中。
  3. 您无法正确管理方法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++); 
    } 

    ... 
}