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++) {

「より小さいか等しい」を使用しましたが、配列の最後の項目のインデックスは (長さ-1) です。

于 2011-02-07T21:54:03.880 に答える
1

他の投稿者が言及しているように、fencepost エラーとも呼ばれる「off-by-one」エラーがあります。

isEmpty()また、次のようにメソッドを簡略化できます。

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

endwhenがゼロの場合、それは両端キューに要素がないことを意味すると想定しています。をチェックしないでください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 に答える