java - 尝试使用数组实现循环队列时出现 ArrayIndexOutOfBoundsException

标签 java arrays data-structures queue

visualization of the queue

以上是作业页面的图表

对于家庭作业,我必须使用数组实现循环队列。除了要附加字符串 "I", "J", "K", "L" 的情况之外,我的所有条件都有效。作为此操作的结果,数组中的一些新值应该循环回到开头。但是,在附加第二个字母时,我收到 ArrayIndexOutOfBoundsException

调试器进一步将问题跟踪到 toString 方法,但我无法理解问题所在。

有什么建议吗?

public class CircularArrayQueueApp {
    public static void main(String[] args) {

        CircularArrayQueue queue = new CircularArrayQueue(10);

        String[] data1 = {"A", "B", "C", "D", "E", "F", "G", "H"};
        String[] data2 = {"I", "J", "K", "L"};

        for (String aData1 : data1) queue.enqueue(aData1);

        System.out.println(queue.first());
        System.out.println(queue);

        for (int i = 0; i < 4; i++) {
            int index = queue.getRead();
            System.out.println("\"" + queue.dequeue() + "\" has been dequeued at index " + index);
        }

        System.out.println(queue.first());
        System.out.println(queue);

        for (int i = 0; i < 4; i++) {
            queue.enqueue(data2[i]);
        }

        System.out.println(queue.first());
        System.out.println(queue);    

    }

    static class CircularArrayQueue {
        private final int length;
        private int read;
        private int write;
        private final Object[] data;

        public CircularArrayQueue(int size) {
            data = new Object[size];
            length = data.length;
            read = 0;
            write = 0;
        }

        Object read() {
            Object o;
            o = data[read];
            read = (read + 1) % length;

            return o;
        }

        Object first() {
            if (isEmpty()) {
                System.out.println("**Empty queue**");
                return null;
            }
            return data[read];
        }

        void write(Object o) {
            data[write] = o;
            write = (write + 1) % length;
        }

        boolean enqueue(Object o) {
            if (isFull()) {
                System.out.println("**Full queue**");
                return false;
            }
            write(o);
            return true;
        }

        public Object[] getData() {
            return data;
        }

        Object dequeue() {
            if (isEmpty()) {
                System.out.println("**Empty queue**");
                return null;
            }
            return read();
        }

        boolean isFull() {
            return read == (write + 1) % length;
        }

        boolean isEmpty() {
            return read == length;
        }

        public String toString() {
            String output = "[";

            for (int i = read; ((i) % length) != write; i++)
                output += data[i] + " ";

            return output.substring(0, output.length() - 1) + "]";
        }

        public int getRead() {
            return read;
        }

        public int getSize() {
            return length;
        }

        public int getWrite() {
            return write;
        }
    }
}

最佳答案

您没有修改数组查找的值。还可以尝试使用字符串连接器来简化事情

StringJoiner sj = new StringJoiner(" ", "[", "]");
for (int i = read; i % length != write; i++) {
    sj.add(data[i % length].toString());
}
return sj.toString();

或者在增加的同时进行修改

for (int i = read; i != write; i = (i + 1) % length) {
    sj.add(data[i].toString());
}

关于java - 尝试使用数组实现循环队列时出现 ArrayIndexOutOfBoundsException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39376213/

相关文章:

java - 从java中的类中删除命名空间

java - java中的socket问题

algorithm - 用于计算某个范围内的整数的数据结构?

java - 节点数组如何工作?

python - 创建一组 Python 类

java - : api. jar + impl.jar + bundle.jar 的用途是什么?

java - 使用 parLapply 将数据帧写入 Oracle 数据库时出现 JVM 错误

C用数学函数初始化三维数组?

arrays - Presto查询行数组

java - 计算数组中递增的元素