在Java中添加到ArrayDeque的前面

时间:2016-01-26 13:32:39

标签: java arrays deque arraydeque

我的任务是创建一个方法,在不使用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());
}
}

知道我哪里出错了?

1 个答案:

答案 0 :(得分:1)

你能澄清“不使用Deque库的ArrayDeque”吗?这是否意味着您不想使用JDK中的ArrayDeque

你在数组复制语句中出错,应该是

copyarr[i] = arr[i-1]

(注意索引如何移位)

您的实现在前面添加元素时会产生严重的运行时成本,因为您每次都在复制数组。 (来自计算机科学类:ArrayLists在需要时通过将数组大小加倍来获得运行时行为,从而平衡所有追加操作的重新调整成本。)

另外,正如评论中已经提到的那样,看一下ArrayDeque实现的灵感。也许offerFirst正是您所需要的。

根据Ferrybig的评论添加:

您可能希望在额外变量中跟踪数组大小,以便存储阵列可以大于实际双端队列。这样,当存储阵列太小时,您可以将存储阵列大小加倍,从而使您不必每次都创建副本。 仍然,你必须移动元素(从较高的索引到较低的索引),最后放在第一个位置的新元素。

第二个优化步骤:保存第一个位置,如果您希望在前面插入多个插入,则保留一些空间,这样您就不必在每次插入时移动元素。 (同样,你正在为运行时复杂性进行空间交易。)