java - 迭代器和抛出异常

标签 java algorithm iterator stack queue

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

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");
      }
    }

最佳答案

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

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

对于第二个问题,您缺少构造异常的 new 关键字。应该是这样的:

throw new java.util.NoSuchElementException();

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

throw new NoSuchElementException();

关于java - 迭代器和抛出异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50849903/

相关文章:

java - 您可以将第 n 个元素移动到堆栈顶部的堆栈

C++:迭代器 - list.begin() 抛出错误

java - struts2中如何迭代对象集合?

java - 具有扩展泛型类型的方法签名 "incorrect"

java - 我可以在哪里使用 jasypt 存储加密 key

algorithm - 为什么加权快速联合算法考虑树的大小而不是它们的高度?

python list __iter__ 方法在每个循环中调用?

java - 重定向标准输出和标准输入 - Java

java - 无法初始化类

javascript - 如何将具有父子关系的嵌套数组转换为普通数组?