找不到基于数组的deque的问题,但是outOfBounds异常

时间:2011-02-08 17:36:23

标签: java deque

我一直在试图解决这个问题,但无济于事。我想我的代码必须有几个问题我无法看到。我之前使用稍微复杂的方式实现了这一点,并且正在以更简单的形式编写它,以帮助在我下面挣扎的那一年的朋友,但我最终让自己陷入困境!

代码如下:

 public class ArrayBasedDeque<EltType> implements Deque<EltType> {

  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 EltType first() {
    return  deque[0];
  }
  public EltType last() {
    return deque[end];
  }

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

  public int size() {
   return deque.length;
  }

  public boolean isFull() {
   int curSize = size();
   return curSize >= 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;
   end++;
  }

  public void insertLast(EltType last) {
    if (isFull()){
          EltType[] tempArray;
      tempArray = (EltType[]) new Object[CAPACITY+1];
      for (int i=0;i<deque.length;i++) {
        tempArray[i] = deque[i]; 
      }
    }
    deque[end] = last;   
    end++;
  }

  public EltType removeFirst() {
    EltType[] tempArray;
    EltType returned = deque[0];
    tempArray = (EltType[]) new Object[capacity];
      for (int i=1;i<capacity;i++) {
        tempArray[i-1] = deque[i]; 
      }
      deque = tempArray;
      end--;
    return returned;
  }

  public EltType removeLast() {
    EltType[] tempArray;
        System.out.println(end);
    EltType returned = deque[end];

    tempArray = (EltType[]) new Object[capacity];
      for (int i=0;i<deque.length;i++) {
        tempArray[i] = deque[i]; 
      }
      deque = tempArray;
    return returned;
  }
}

问题在于我打电话

abd.insertFirst( 3 );
abd.insertFirst( 3 );
abd.insertFirst( 3 );

这样,它会返回错误。

java.lang.ArrayIndexOutOfBoundsException: 11
    at ArrayBasedDeque.insertFirst(ArrayBasedDeque.java:37)
    at TestABD.main(TestABD.java:7)
    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)

对于insertLast方法也是如此。我无法理解,并希望stackOverflow的审视凝视可以帮助我。非常感谢!

3 个答案:

答案 0 :(得分:4)

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

第一次方法调用后,deque是一个长度为11的数组(deque == tempArray == new Object[capacity+1] == new Object[11]。调用该方法的时间,您为tempArray == capacity+1个时段分配11,但是从0deque.length遍历for循环,0在第二个方法调用上,1}}到10。循环的最后一遍最终为:

tempArray[11] = ...

超过tempArray的末尾,只有11个广告位[0][10])。


天真的修复方法是让for循环从0转到capacity而不是从0转到deque.length,但我不确定这是否实现了你想要的实际行为。另一种方法是分配tempArray = new Object[deque.length+1],但是capacity并不真正意味着容量,它仍然可能无法在概念上反映出您认为在这种情况下的“正确”行为。

答案 1 :(得分:0)

我在Java方面没有太多经验,所以我可能会离开这里,但是......当你调用InsertFirst时,没有任何值设置为容量。所以它默认为0或垃圾。无论哪种方式,当你打电话   tempArray =(EltType [])new Object [capacity + 1]; 容量将为1或......某些“随机”数字。因此,为什么要退出边缘。我猜你的意思是使用CAPACITY?

答案 2 :(得分:0)

以下是该特定错误的答案。您没有更新实例变量capacity所以每次调用insertFirst时临时数组数组实际上并没有增长。因此代码应如下所示:

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

尽管如此,整个课程还远远不够。