Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 使用循环数组实现队列:调整循环数组大小的最佳方法是什么?_Java_Arrays_Resize_Queue_Circular Buffer - Fatal编程技术网

Java 使用循环数组实现队列:调整循环数组大小的最佳方法是什么?

Java 使用循环数组实现队列:调整循环数组大小的最佳方法是什么?,java,arrays,resize,queue,circular-buffer,Java,Arrays,Resize,Queue,Circular Buffer,我正在使用一个循环数组实现一个队列,我有点陷入了resize()方法实现中(当数组已满时) 在enqueue()方法中,我检查数组的大小是否等于它的长度,并获取它是否已满。现在,我没有抛出异常,而是尝试调整数组的大小 问题是,我有两个案子要考虑 front考虑要移动的数组元素块,以及它们在新数组中的位置。然后,使用System.arraycopy执行此操作。如果front

我正在使用一个循环数组实现一个队列,我有点陷入了
resize()
方法实现中(当数组已满时)

enqueue()
方法中,我检查数组的大小是否等于它的长度,并获取它是否已满。现在,我没有抛出异常,而是尝试调整数组的大小

问题是,我有两个案子要考虑


  • front考虑要移动的数组元素块,以及它们在新数组中的位置。然后,使用System.arraycopy执行此操作。如果front要复制包含多个元素的数组,请使用,因为它通常作为本机代码实现,例如Sun的VM使用手工编码的汇编程序

    前部>后部

    因为数据是连续的,所以它可以保留在新数组中的相同位置

    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,我非常感谢,我将尝试这样做:)