ArrayIndexOutOfBoundsException при попытке реализовать круговую очередь с использованием массивов
Выше представлен диаграммой со страницы назначения
Для домашнего задания я должен реализовать круговую очередь, используя массивы. У меня все условия работают, кроме случая, когда строки "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;
}
}
}
Вы, вероятно, следует использовать 'данные [я% длины]', а не 'данных [i] 'в вашем методе' toString() '. – Eran
Спасибо за помощь. Мой ответ на ответ flkes применяется так же, как и ваш, поскольку элементы не обтекают, как должны. Однако вы разрешили проблему с исключениями. Спасибо за это! – jollypop
Ваш код производит '[E F G H I J K L]' в конце (после исправления в 'toStrig()'). Кажется правильным для меня. В то время как физическое местоположение 'K' и' L' находится в начале массива поддержки, их логическая позиция находится в конце очереди. – Eran