2011-02-07 10 views
0

一般的な値(EltType)を両面キュー(デキュー)に挿入するためにこのメソッドを実行しようとしていますが、私は把握できない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) 

答えて

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

は、インデックスのためにあなたが「よりも小さいかまたは等しい」を使用するが、アレイの最後の項目は、(長さ1)を有する

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

に変更すべきです。

0

?おそらく定数であってはなりません。追加するとサイズも増えません。

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

あなたは<、ない<=を使用する必要があります。

0

B/cあなたは< =を使用していますが、deque.lengthは10になりますが、両端キューには9個のインデックスしかありません。

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

使用<代わり<=について他の回答に加えてループ

3

のために、あなたは常に11あなたはおそらく意味になりますCAPACITY + 1、に一時配列サイズを設定している中:

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

また、大文字と小文字が異なる変数名を使用することはお勧めしません。それは悪い習慣で、あなたはここでなぜ見ることができます。定数の名前をINITIAL_CAPACITYに変更します。 – David

1

他のポスターに記載されているように、フェンスポストエラーとも呼ばれる「オフバイワン」エラーがあります。次のように

また、あなたはあなたのisEmpty()方法を簡素化することができます。

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

を私はendがゼロの場合、そのは両端キューに要素が存在しないことを意味すると仮定しています。 deque.lengthをチェックしてはいけません。なぜなら、アレイに格納できる要素の数を示しているだけで、現在配列にいくつの要素が格納されているのかはわかりません。サイドノートとして

0

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

がない:

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

がsimplier見えますか?

+0

あなたは 'return'キーワードを見逃しました;) –