双面排队问题

时间:2011-02-07 21:48:45

标签: java deque

我正在尝试运行此方法将一个通用值(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)

7 个答案:

答案 0 :(得分:3)

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

tempArray = (EltType[]) new Object[capacity+1];

答案 1 :(得分:2)

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

应改为

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

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

答案 2 :(得分:1)

正如其他海报所提到的,你有一个“一个一个”错误,也称为fencepost错误。

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

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

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

答案 3 :(得分:0)

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

答案 4 :(得分:0)

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

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

答案 5 :(得分:0)

你正在使用的B / c&lt; =,你的deque.length是10,但是deque只有9个索引。

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

使用&lt;而是在for循环中

答案 6 :(得分:0)

作为旁注:

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

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

看起来更简单?