Java 使用循环数组实现队列:调整循环数组大小的最佳方法是什么?
我正在使用一个循环数组实现一个队列,我有点陷入了Java 使用循环数组实现队列:调整循环数组大小的最佳方法是什么?,java,arrays,resize,queue,circular-buffer,Java,Arrays,Resize,Queue,Circular Buffer,我正在使用一个循环数组实现一个队列,我有点陷入了resize()方法实现中(当数组已满时) 在enqueue()方法中,我检查数组的大小是否等于它的长度,并获取它是否已满。现在,我没有抛出异常,而是尝试调整数组的大小 问题是,我有两个案子要考虑 front考虑要移动的数组元素块,以及它们在新数组中的位置。然后,使用System.arraycopy执行此操作。如果front
resize()
方法实现中(当数组已满时)
在enqueue()
方法中,我检查数组的大小是否等于它的长度,并获取它是否已满。现在,我没有抛出异常,而是尝试调整数组的大小
问题是,我有两个案子要考虑
System.arraycopy(oldArray, front, newArray, front, front-rear);
// copy [rear to end]
System.arraycopy(oldArray, rear, newArray, 0, oldArray.length-rear);
// copy [0 to front]
System.arraycopy(oldArray, 0, newArray, oldArray.length-rear, front);
front = oldArray.length-(rear-front);
rear = 0;
front如果您的数组已满,则要么是
front==rear-1
,要么是rear==0
和front==length-1
(或者反过来说,我不知道您的术语)。在第二种情况下,您可以一步复制整个阵列,在(更一般的)第一种情况下,您有两个要复制的块(0..front和rear..length-1)。谢谢您的答案和不同的解决方案!:)
虽然使用System.arraycopy()方法是最简单有效的解决方案,但我不得不避免使用它,而是自己实现了一个解决方案
因此,如果有人想在没有System.arraycopy()的队列实现中调整()循环数组的大小,下面是我的最终解决方案:
private void resize() {
E[] aux = (E[]) new Object[Q.length * 2]; // new array
int i = 0; // use this to control new array positions
int j = f; // use this to control old array positions
boolean rearReached = false;
while (!rearReached) {
rearReached = j % Q.length == r; // is true if we've reached the rear
aux[i] = Q[j % Q.length];
i++;
j++;
}
f = 0;
r = Q.length - 1;
Q = aux;
}
如您所见,我利用了“循环”的优势,使用%操作符将旧数组的位置映射到新数组
结果数组的容量是新数组开始时所有元素(显然保持原始顺序)的两倍
System.arraycopy(oldArray, front, newArray, front, front-rear);
// copy [rear to end]
System.arraycopy(oldArray, rear, newArray, 0, oldArray.length-rear);
// copy [0 to front]
System.arraycopy(oldArray, 0, newArray, oldArray.length-rear, front);
front = oldArray.length-(rear-front);
rear = 0;
我已经测试过了,它工作正常。让我知道,如果有任何不便与该代码
对于您的快速回答@mdma,我非常感谢,我将尝试这样做:)