В очереди генерируется ошибка, если в нее вводится более трех имен:
Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 3
at hotelobjects.Queue.addqueue(Queue.java:17)
at hotelobjects.HotelObjects.addCustomers(HotelObjects.java:82)
at hotelobjects.HotelObjects.main(HotelObjects.java:44)
Java Result: 1
Как я могу гарантировать, что любые имена, введенные после того, как оригинал 3 будет размещен в передней части очереди, круговым способом.
package hotelobjects;
import java.util.*;
import java.io.*;
public class HotelObjects {
static Queue myQueue = new Queue();
/**
* @param args the command line arguments
*/
public static void main(String[] args) throws Exception {
String command;
Scanner input = new Scanner(System.in);
Room[] myHotel = new Room[10];
for (int x = 0; x < myHotel.length; x++) {
myHotel[x] = new Room();
}
System.out.println("10 Rooms Created");
while (true) {
System.out.print("\nEnter command or 'X' to exit: ");
command = input.next();
command = command.toLowerCase();
if (command.charAt(0) == 'x') {
System.exit(0);
}
if (command.charAt(0) == 'a') {
addCustomers(myHotel);
}
if (command.charAt(0) == '3') {
displayNames(myHotel);
}
}
}
private static void addCustomers(Room myHotel[]) {
String roomName;
int roomNum;
System.out.println("Enter room number (0-10) or 11 to exit:");
Scanner input = new Scanner(System.in);
roomNum = input.nextInt();
if (roomNum<11) {
System.out.println("Enter name for room " + roomNum + " :");
roomName = input.next();
roomName = roomName.toLowerCase();
myHotel[roomNum].setName(roomName);
myQueue.addqueue(roomName);
}
else {
System.exit(0);
}
}
private static void displayNames(Room[] myHotel) {
System.out.println("The last 3 names entered are: ");
for (int x = 0; x < 3; x++) {
myQueue.takequeue();
}
}
}
Вот класс "queue":
package hotelobjects;
public class Queue {
String qitems[] = new String[3];
int front = 0, end = 0;
void addqueue(String roomName) {
qitems[end] = roomName;
end++;
}
void takequeue() {
if (end > front) {
System.out.println("Name Entered : " + qitems[front]);
front++;
} else {
System.out.println("No Name");
}
}
}
Увеличьте индексный модуль до максимального количества элементов в очереди:
void addqueue(String roomName) {
qitems[end] = roomName;
end = (end + 1) % 3;
}
Итак, вы получаете:
end = (0 + 1) % 3 = 1
end = (1 + 1) % 3 = 2
end = (2 + 1) % 3 = 0
end = (0 + 1) % 3 = 1
...
Вы также должны изменить метод takequeue()
чтобы рассмотреть тот факт, что очередь теперь круглая. Что-то вроде этого:
void takequeue() {
System.out.println("Name Entered : " + qitems[front]);
front = (front + 1) % 3;
}
Также неплохо создать константу для хранения емкости очереди вместо повторения значения 3
по всему коду:
private static final int CAPACITY = 3;