0

我正在尝试运行此方法以将通用值 (EltType) 插入到双面队列 (deque) 中,但我不断收到我无法弄清楚的 outOfBoundsException。有人能帮我解决这个问题吗?这只是代码的摘录,但我认为可以从中拼凑起来!

  private final int CAPACITY = 10;
  private int capacity;
  private int end;
  private EltType deque[];  

  public ArrayBasedDeque() {
    this.capacity = CAPACITY;
    deque = (EltType[]) (new Object[capacity]);  
  }

    public void insertFirst(EltType first) {
        if(!isEmpty()) {
        EltType[] tempArray;
        tempArray = (EltType[]) new Object[CAPACITY+1];
        for (int i=0;i<=deque.length;i++) {
          tempArray[i+1] = deque[i]; 
        }
        deque = tempArray; 
        }
       deque[0] = first;
      }

  public boolean isEmpty() {
    boolean returned;
    if (deque.length < 1) {
     returned = true; 
    }else {
     returned = false; 
    }
    return returned;
  }

错误 :

java.lang.ArrayIndexOutOfBoundsException: 10
    at ArrayBasedDeque.insertFirst(ArrayBasedDeque.java:48)
    at TestABD.main(TestABD.java:5)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
    at java.lang.reflect.Method.invoke(Unknown Source)
    at edu.rice.cs.drjava.model.compiler.JavacCompiler.runCommand(JavacCompiler.java:271)
4

7 回答 7

3

除了关于 的其他答案之外<=,您还将临时数组大小设置为 CAPACITY+1,始终为 11。您可能的意思是:

tempArray = (EltType[]) new Object[capacity+1];
于 2011-02-07T21:56:36.173 回答
2
for (int i=0;i<=deque.length;i++) {

应该改成

for (int i=0;i<deque.length;i++) {

您使用了“小于或等于”,但数组的最后一项具有 (length-1) 的索引。

于 2011-02-07T21:54:03.880 回答
1

正如其他张贴者所提到的,您有一个“不合一”的错误,也称为栅栏错误。

isEmpty()此外,您可以按如下方式简化您的方法:

public boolean isEmpty() {
    return end == 0;
}

我假设 whenend为零,那么这意味着双端队列中没有元素。您不应该检查deque.length,因为它只是告诉您数组可以存储多少元素,而不是数组中当前有多少元素。

于 2011-02-07T22:00:42.947 回答
0

你在哪里改变你的能力?它可能不应该是一个常数。添加时大小也不会增加。

于 2011-02-07T21:53:24.787 回答
0
    for (int i=0;i<=deque.length;i++) {

你应该使用<,而不是<=

于 2011-02-07T21:53:25.147 回答
0

B/c 你使用 <=,你上升到 deque.length 是 10,但 deque 只有 9 个索引。

 for (int i=0;i<=deque.length;i++) {
          tempArray[i+1] = deque[i]; 
 }

在 for 循环中使用 < 代替

于 2011-02-07T21:54:46.703 回答
0

作为旁注:

public boolean isEmpty() {
  boolean returned;
  if (deque.length < 1) {
   returned = true; 
  }else {
   returned = false; 
  }
  return returned;
}

不:

public boolean isEmpty() {
  deque.length < 1
}

看起来更简单?

于 2011-02-07T22:01:13.973 回答