2011-02-07 82 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++) { 

应当改变成

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

您使用的,“小于或等于”,但阵列的最后一个项具有(长度-1)的索引。

0

你在哪里改变你的能力呢?它可能不应该是一个常数。添加时尺寸也不会增加。

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

你应该使用<,不<=

0

您正在使用的B/C < =,你去deque.length是10,但deque只有9个指数。

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

使用<相反在for循环

3

除了有关<=其他的答案,你设置临时数组大小容量+ 1,这将永远是11.您大概意思:

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

此外,我不会建议只有不同的情况下才会有变量名称。这是不好的做法,你可以在这里看到为什么。我会将您的常量重命名为INITIAL_CAPACITY。 – David 2011-02-07 22:01:35

1

正如其他海报提到的,您有一个“off-by-one”错误,也称为fencepost错误。

此外,您还可以按如下简化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`关键字;) – 2017-04-10 03:22:47