Проблема двусторонней очереди - PullRequest
0 голосов
/ 08 февраля 2011

Я пытаюсь запустить этот метод для вставки универсального значения (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 ]

3 голосов
/ 08 февраля 2011

В дополнение к другим ответам о <= вы устанавливаете размер временного массива на CAPACITY + 1, который всегда будет 11. Вы, вероятно, имели в виду:

tempArray = (EltType[]) new Object[capacity+1];
2 голосов
/ 08 февраля 2011
for (int i=0;i<=deque.length;i++) {

следует изменить на

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

Вы использовали «меньше или равно», но последний элемент массива имеет (length-1) для индекса.

1 голос
/ 08 февраля 2011

Как уже упоминалось другими авторами, у вас есть ошибка "off-by-one", также называемая ошибкой забора.

Кроме того, вы можете упростить ваш метод isEmpty() следующим образом:

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

Я предполагаю, что когда end равно нулю, это означает, что в деке нет элементов. Вы не должны проверять deque.length, потому что это просто говорит вам, сколько элементов может хранить массив, а не сколько в настоящее время в массиве.

0 голосов
/ 08 февраля 2011

В качестве примечания:

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

Разве:

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

не выглядит проще?

0 голосов
/ 08 февраля 2011

B / c, который вы используете <=, вы переходите на deque.length, который равен 10, но у deque всего 9 индексов. </p>

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

Используйте <вместо этого в цикле for </p>

0 голосов
/ 08 февраля 2011
    for (int i=0;i<=deque.length;i++) {

Вы должны использовать <, а не <=.

0 голосов
/ 08 февраля 2011

Где вы меняете свои возможности?Это, вероятно, не должно быть константой.При добавлении размер также не увеличивается.

...