我的任务是创建一个方法,在不使用Deque库的情况下添加到ArrayDeque的前面(左侧)。我想出了一个方法,虽然它没有添加到que,它出来了一个空的que。 这是我的addLeft方法:
public T[] addLeft(T item){
T[] copyarr = (T[]) new Object[arr.length+1];
if(isEmpty()){
copyarr[frontPos] = item;
}else{
copyarr[frontPos] = item;
frontPos--;
for(int i = 1; i<copyarr.length; i++){
copyarr[i] = arr[i];
}
}
arr = copyarr;
return arr;
}
以下是测试代码iv:
public class DequeueTest {
public static void main(String[] args) {
Dequeue test = new Dequeue();
test.addLeft(3);
test.addLeft(4);
System.out.println(test.toString());
}
}
知道我哪里出错了?
答案 0 :(得分:1)
你能澄清“不使用Deque库的ArrayDeque”吗?这是否意味着您不想使用JDK中的ArrayDeque?
你在数组复制语句中出错,应该是
copyarr[i] = arr[i-1]
(注意索引如何移位)
您的实现在前面添加元素时会产生严重的运行时成本,因为您每次都在复制数组。 (来自计算机科学类:ArrayLists在需要时通过将数组大小加倍来获得运行时行为,从而平衡所有追加操作的重新调整成本。)
另外,正如评论中已经提到的那样,看一下ArrayDeque实现的灵感。也许offerFirst
正是您所需要的。
根据Ferrybig的评论添加:
您可能希望在额外变量中跟踪数组大小,以便存储阵列可以大于实际双端队列。这样,当存储阵列太小时,您可以将存储阵列大小加倍,从而使您不必每次都创建副本。 仍然,你必须移动元素(从较高的索引到较低的索引),最后放在第一个位置的新元素。
第二个优化步骤:保存第一个位置,如果您希望在前面插入多个插入,则保留一些空间,这样您就不必在每次插入时移动元素。 (同样,你正在为运行时复杂性进行空间交易。)