无法实例化Deque类型

时间:2015-08-10 05:50:54

标签: java

    import java.awt.HeadlessException;
    import java.util.Iterator;
    import java.util.NoSuchElementException;

    import javax.xml.soap.Node;

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

    private int size;
    private Node<Item> head;
    private Node<Item> tail;

    private static class Node<Item> {
        private Item key;
        private Node<Item> leftNode;
        private Node<Item> rightNode;

        Node(Item key, Node<Item> left, Node<Item> right) {
            this.key = key;
            this.leftNode = left;
            this.rightNode = right;
        }

    }


    public Deque() {
        head = new Node<Item>(null,null,null);
        tail = new Node<Item>(null,head,null);
        head.rightNode = tail;
        size = 0;
    }
    public boolean isEmpty() {
        return head.rightNode == tail;
     }
    public int size() {
       return size;
    }
    public void addFirst(Item item) {

       if (item == null) throw new NullPointerException(" trying to add nothing");

       else {
           Node<Item> oldFirstNode = head.rightNode;
           head.rightNode = new Node<Item>(item,head,oldFirstNode);
           oldFirstNode.leftNode = head.rightNode;
           size++;

       }
     }
    public void addLast(Item item)  {

       if (item == null) throw new NullPointerException(" trying to add nothing");

       else {
           Node<Item> oldLastNode = tail.leftNode;
           tail.leftNode = new Node<Item>(item,oldLastNode,tail);
           oldLastNode.rightNode = tail.leftNode;
           size++;

       }
   }

     public Item removeFirst()  {              // remove and return the item from the front

       if (isEmpty()) throw new NoSuchElementException(" Deque is alrady empty");

       else {
           Node<Item> delete = head.rightNode;
           Node<Item> newFirstNode = head.rightNode.rightNode;
           newFirstNode.leftNode = head;
           head.rightNode = newFirstNode;
           delete.leftNode = null;
           delete.rightNode = null;
           Item myKeyItem = delete.key;
           delete = null;
           size--;
           return myKeyItem;
       }

   }
   public Item removeLast() {                 // remove and return the item from the end

       if (isEmpty()) throw new NoSuchElementException(" Deque is alrady empty");

       else {
           Node<Item> delete = tail.leftNode;
           Node<Item> newLastNode = tail.leftNode.leftNode;
           newLastNode.rightNode = tail;
           tail.leftNode = newLastNode;
           delete.leftNode = null;
           delete.rightNode = null;
           Item myKeyItem = delete.key;
           delete = null;
           size--;
           return myKeyItem;
       }
   }


   public Iterator<Item> iterator() {         // return an iterator over items in order from front to end
       return new DequeIterator();
   }

   private class DequeIterator implements Iterator<Item> {

       private Node<Item> current = head.rightNode;

       public boolean hasNext() {return current != tail;}

       public void remove() { throw new UnsupportedOperationException("not yet");  }

       public Item next() {
           if (!hasNext()) throw new NoSuchElementException("no next");
           Item key = current.key;
           current = current.rightNode;
           return key;

       }
   }
     public static void main(String[] args) { 

   Deque<Integer>[] s = new Deque[10];
   for (int i = 0; i < 10; i++) {
   s[i] =new Deque<Integer>(); // initial each object
   }
   s[0].addFirst(1);
  // s[1].addFirst(2);
   StdOut.print(s[0]);
   //StdOut.print(s[1]);

  } 


   } 

在下面的代码中,我有一个编译错误统计信息&#34;无法实例化Deque&#34;类型。

package Assign3;

 import java.util.Deque;



 public class graph {

//private Deque<Integer>[] graphRepDeques;
final static int Amount = 200;

private Deque<Integer>[] s = new Deque[Amount];

public graph(String filename) {

    In in = new In(filename);
    //final int Amount = 200;
    s = new Deque[Amount];

    for (int i = 0; i < Amount; i++) {

        String[] currentLine = in.readLine().split("\\s");
        int size = currentLine.length;
         s[i] =new Deque<Integer>(); // why Cannot instantiate the type Deque<Integer>???????
        for (int j = 1; j < size; j++) {
            int temp = Integer.parseInt(currentLine[j]);
            s[i].add(temp);
        }
    }


}

private  void show() {

    for (int i = 0; i < Amount; i++) {
           for (int a: s[i]) {
               //StdOut.print(a + " ");
           }
    }

}

public static void main(String[] args) {
    graph a = new graph("kargerMinCut.txt"); //whatever text you like with integers
    a.show();
}

}

我得到的错误是

Cannot instantiate the type Deque<Integer>

我可以在课堂上的主要功能中实例化Deque&#34; Deque&#34;,但为什么我不能在课堂上做到这一点&#34; graph&#34;?这里很困惑

感谢任何帮助。

我的代码的目标是阅读数字     在一个文件中逐行和每行,     我将我得到的数字存储在Deque类的对象中。     因此,我需要一个对象数组     Deque存储所有数字。 类似于一个链表列表(我的代码中的Deque)。

问题是我不知道如何正确地初始化这个链表(我的代码中的Deque)的数组,所以我可以&#34;推&#34;每个链表中的所有键(Deque)

2 个答案:

答案 0 :(得分:1)

在您编辑的代码中,问题是您只是初始化数组。不是Deque个对象。

Deque<Integer>[] s = new Deque[10];

以上只会创建一个包含10个元素的Array(并将所有元素初始化为null)。

因此s[0]null,就像任何其他索引一样。您正尝试在addFirst(1)元素上调用null

因此,在使用它们之前,你应该将数组中的每个元素初始化,

s[i] = new Deque(); // In a loop if needed.

答案 1 :(得分:0)

由于您应用了Codebender的提示,您现在只需要替换

s[i] = new Deque<Integer>();

使用:

s[i] = new LinkedList<Integer>();

正如您在问题中已经提到的那样。

java.util.Deque只是一个接口,因此无法直接实例化。您的所有变量(包括数组)仍然可以分别是DequeDeque[]类型,因为java.util.LinkedList实现了该接口。