2016-09-07 1 views
1

visualization of the queueArrayIndexOutOfBoundsException при попытке реализовать круговую очередь с использованием массивов

Выше представлен диаграммой со страницы назначения

Для домашнего задания я должен реализовать круговую очередь, используя массивы. У меня все условия работают, кроме случая, когда строки "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; 
     } 
    } 
} 
+3

Вы, вероятно, следует использовать 'данные [я% длины]', а не 'данных [i] 'в вашем методе' toString() '. – Eran

+0

Спасибо за помощь. Мой ответ на ответ flkes применяется так же, как и ваш, поскольку элементы не обтекают, как должны. Однако вы разрешили проблему с исключениями. Спасибо за это! – jollypop

+0

Ваш код производит '[E F G H I J K L]' в конце (после исправления в 'toStrig()'). Кажется правильным для меня. В то время как физическое местоположение 'K' и' L' находится в начале массива поддержки, их логическая позиция находится в конце очереди. – Eran

ответ

1

Вы не модифицируете значение поиска массива. Также попробуйте использовать строку столяра, чтобы упростить вещи

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()); 
} 
+0

Благодарим вас за ответ, Это исключает исключение, но теперь новые значения * все * добавляются в конец очереди, а не две последние строки, обернутые до начала. Я обновляю свой пост с изображением, чтобы дать некоторые пояснения. – jollypop