迭代器和抛出异常

时间:2018-06-14 05:00:47

标签: java algorithm iterator stack queue

我正在尝试制作双头deque但我一直遇到错误我坦率地不知道如何解决。第一个是关于双端队列。在我的迭代器函数中,我不断收到以下错误,我不明白为什么:

Deque.java:105: error: incompatible types: Deque.DequeIterator cannot be converted to Iterator<Item>
    return new DequeIterator();

此外,我一直试图抛出异常,但由于某种原因,我们无法做到。我不断收到如下错误:

Deque.java:72: error: cannot find symbol
      throw java.util.NoSuchElementException();
                ^
  symbol:   class util
  location: package java

这是我的代码:

    import java.util.Iterator;
    import java.util.NoSuchElementException;

    public class Deque<Item> implements Iterable<Item>{

      private int size;

      private Node<Item> first;
      private Node<Item> last;

      private class Node<Item>{
        Item item;
        Node<Item> next;
        Node<Item> prev;

        Node(Item item) {
                this.item = item;
                next = null;
                prev = null;
            }
      }

      // construct an empty deque
      public Deque(){
        first = null;
        last = null;
        size = 0;
      }

      public boolean isEmpty(){return size == 0;} // is the deque empty?
      public int size(){return size;}              // return the number of items on the deque

      // add the item to the front
      public void addFirst(Item item){
        if (item == null){
          throw new java.lang.NullPointerException();
        }
        else if (this.isEmpty()){
          first = new Node(item);
          first = last;
        }
        else{
          Node oldfirst = first;
          Node first = new Node(item);
          first.next = oldfirst;
          oldfirst.prev = first;
        }
        size ++;
      }

      // add the item to the end
      public void addLast(Item item){
        if (item == null){
          throw new java.lang.NullPointerException();
        }
        else if (this.isEmpty()){
          Node last = new Node(item);
          last = first;
        }
        else{
          Node oldlast = last;
          Node last = new Node(item);
          oldlast.next = last;
          last.prev = oldlast;
        }
        size ++;
      }

      // remove and return the item from the front
      public Item removeFirst(){
        if (this.isEmpty()){
          throw java.util.NoSuchElementException();
        }
        else{
          Item item = first.item;
          first = first.next;
          first.prev = null;
          if (size == 1){
            first = last;
          }
          size --;
          return item;
        }
      }

      // remove and return the item from the end
      public Item removeLast(){
        if (this.isEmpty()){
          throw java.util.NoSuchElementException();
        }
        else{
          Item item = last.item;
          last = last.prev;
          if (size == 1){
            last = first;
          }
          size --;
          return item;
        }
      }

      // return an iterator over items in order from front to end

      public Iterator<Item> iterator()  {
        return new DequeIterator();
      }


      private class DequeIterator<Item> implements Iterable<Item>{
        private Node current;

        public DequeIterator() { this.current = first;}

        public boolean hasNext(){ return current != null;};
        public void remove() {throw new UnsupportedOperationException();}
        public Item next(){
          if (!hasNext()) throw new NoSuchElementException();
          Item item = current.item;
          current = current.next;
          return item;
        }

      }



      // unit testing (optional)
      public static void main(String[] args){
        Deque<String> deque = new Deque<String>();
        deque.addFirst("1");
        //StdOut.println("addfirst to string: " + deque.AXCToString());
        deque.addFirst("2");
        //StdOut.println("addfirst to string: " + deque.AXCToString());
        deque.addFirst("3");
        //StdOut.println("addfirst to string: " + deque.AXCToString());
        deque.addFirst("4");
        //StdOut.println("addfirst to string: " + deque.AXCToString());
        deque.addFirst("5");
      }
    }

1 个答案:

答案 0 :(得分:1)

您的第一个问题是,DequeIterator类实现Iterable时应该实现IteratorIterable通常用于集合之类的东西,然后可以提供Iterator个实例。看起来您已经为Iterator实现了方法,所以这应该只是将行更改为:

private class DequeIterator<Item> implements Iterator<Item> {

对于您的第二个问题,您错过了new关键字来构造异常。它应该如下:

throw new java.util.NoSuchElementException();

此外,Java中的标准做法是使用导入而不是使用绝对路径,看起来您已经导入了它,因此您可以将其缩短为:

throw new NoSuchElementException();