我一直在试图解决这个问题,但无济于事。我想我的代码必须有几个问题我无法看到。我之前使用稍微复杂的方式实现了这一点,并且正在以更简单的形式编写它,以帮助在我下面挣扎的那一年的朋友,但我最终让自己陷入困境!
代码如下:
public class ArrayBasedDeque<EltType> implements Deque<EltType> {
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 EltType first() {
return deque[0];
}
public EltType last() {
return deque[end];
}
public boolean isEmpty() {
return end == 0;
}
public int size() {
return deque.length;
}
public boolean isFull() {
int curSize = size();
return curSize >= 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;
end++;
}
public void insertLast(EltType last) {
if (isFull()){
EltType[] tempArray;
tempArray = (EltType[]) new Object[CAPACITY+1];
for (int i=0;i<deque.length;i++) {
tempArray[i] = deque[i];
}
}
deque[end] = last;
end++;
}
public EltType removeFirst() {
EltType[] tempArray;
EltType returned = deque[0];
tempArray = (EltType[]) new Object[capacity];
for (int i=1;i<capacity;i++) {
tempArray[i-1] = deque[i];
}
deque = tempArray;
end--;
return returned;
}
public EltType removeLast() {
EltType[] tempArray;
System.out.println(end);
EltType returned = deque[end];
tempArray = (EltType[]) new Object[capacity];
for (int i=0;i<deque.length;i++) {
tempArray[i] = deque[i];
}
deque = tempArray;
return returned;
}
}
问题在于我打电话
abd.insertFirst( 3 );
abd.insertFirst( 3 );
abd.insertFirst( 3 );
这样,它会返回错误。
java.lang.ArrayIndexOutOfBoundsException: 11
at ArrayBasedDeque.insertFirst(ArrayBasedDeque.java:37)
at TestABD.main(TestABD.java:7)
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)
对于insertLast方法也是如此。我无法理解,并希望stackOverflow的审视凝视可以帮助我。非常感谢!
答案 0 :(得分:4)
tempArray = (EltType[]) new Object[capacity+1];
for (int i=0;i<deque.length;i++) {
tempArray[i+1] = deque[i];
}
deque = tempArray;
第一次方法调用后,deque
是一个长度为11的数组(deque
== tempArray
== new Object[capacity+1]
== new Object[11]
。调用该方法的时间,您为tempArray
== capacity+1
个时段分配11
,但是从0
到deque.length
遍历for循环,0
在第二个方法调用上,1}}到10
。循环的最后一遍最终为:
tempArray[11] = ...
超过tempArray
的末尾,只有11
个广告位[0]
到[10]
)。
天真的修复方法是让for循环从0
转到capacity
而不是从0
转到deque.length
,但我不确定这是否实现了你想要的实际行为。另一种方法是分配tempArray = new Object[deque.length+1]
,但是capacity
并不真正意味着容量,它仍然可能无法在概念上反映出您认为在这种情况下的“正确”行为。
答案 1 :(得分:0)
我在Java方面没有太多经验,所以我可能会离开这里,但是......当你调用InsertFirst时,没有任何值设置为容量。所以它默认为0或垃圾。无论哪种方式,当你打电话 tempArray =(EltType [])new Object [capacity + 1]; 容量将为1或......某些“随机”数字。因此,为什么要退出边缘。我猜你的意思是使用CAPACITY?
答案 2 :(得分:0)
以下是该特定错误的答案。您没有更新实例变量capacity
所以每次调用insertFirst
时临时数组数组实际上并没有增长。因此代码应如下所示:
public void insertFirst(EltType first) {
if (!isEmpty()) {
EltType[] tempArray;
capacity += 1;
tempArray = (EltType[]) new Object[capacity];
for (int i = 0; i < deque.length; i++) {
tempArray[i + 1] = deque[i];
}
deque = tempArray;
}
deque[0] = first;
end++;
}
尽管如此,整个课程还远远不够。