我有一个用于处理航班预订的程序。我的程序包括3个类:主类,一个用于创建乘客信息的名为“旅客”的类,以及一个处理航班信息本身注册的类。
为了处理座位注册,我首先在main中调用方法Passenger.setSeatNumber()。然后,此方法在Registration类中调用一个方法,并将此操作的结果分配给乘客的座位号变量,然后在主要情况下,我通过getSeatNumber()方法分配该座位号。(我知道这很冗长,但是老师希望我们能理解OOP和多个类,因此我们应该使用所有这些方法和类来处理这些东西)
现在,在我的用于分配席位的注册方法中,如果用户尝试输入小于0或大于20的值,或者如果输入的值已经存在于用户名中,则我有一个if语句应评估为true包含已注册席位的HashSet。如果计算结果为true,则应抛出自定义异常以获取正确的输入。问题是,即使我输入一个负数或超过20,该条件也永远不会求值为真,并且HashSet似乎也没有在注册数字。
public static int asientosReservados(int x) {
HashSet<Integer> asientos = new HashSet(21);
asientos.add(x);
//Añadir un duplicado a un HashSet no lanza un error, sino que la operación retorna false.
//Con este método, al retornar 0 para false
//o 1 para true, se puede más adelante determinar si ocurrió un duplicado.
if (asientos.add(x) == false) {
return 0;
} else {
return 1;
}
}
//Seleccionar y retornar asiento.
//Se va a revisar que sea en el rango correcto y que este no sea duplicado.
public void seleccionarAsiento() {
do{
try{
ExcepcionRegistro e = new ExcepcionRegistro("Ha ocurrido un error con el registro del asiento.");
System.out.println("\n\n Digite el número de asiento del 0 hasta el 20");
this.asiento = input.nextInt();
asientosReservados(this.asiento);
if(this.asiento < 0 || this.asiento > 20 || asientosReservados(this.asiento) == 0) {
throw e;
}
continuarCiclo = false;
}
//Bloque catch para determinar si el asiento estaba fuera de rango o si ya existia.
catch (ExcepcionRegistro e) {
if (this.asiento < 0 || this.asiento > 20){
System.out.println(e.getMessage());
System.out.println("\nPor favor seleccione nuevamente un asiento entre el 1 y el 20.");
input.nextLine();
} else {
System.out.println(e.getMessage());
System.out.println("\nEl asiento seleccionado ya está ocupado. Seleccione otro");
input.nextLine();
}
}
} while (continuarCiclo == true);
}
请评论asientos.add(x):
asientos.add(x); comment this line
//it try add the entry in hashset again when you are
going
// in if condition he found that entry is already added
//so it will return false.
//Añadir un duplicado a un HashSet no lanza un error,
sino que la operación retorna false.
//Con este método, al retornar 0 para false
//o 1 para true, se puede más adelante determinar si
ocurrió un duplicado.
if (asientos.add(x) == false) {
return 0;
} else {
return 1;
}
更改班级以匹配:
public class Registration{
public static class NotAValidSeatNumberValueExeption extends NumberFormatException{
public NotAValidSeatNumberValueExeption(String value) {
super(value);
}
}
public static class SeatIndexOutOfBoundsException extends IndexOutOfBoundsException{
public SeatIndexOutOfBoundsException(String value) {
super(value);
}
}
public static class SeatAlreadyTakenException extends IllegalArgumentException{
public SeatAlreadyTakenException(String value) {
super(value);
}
}
private static final Scanner input = new Scanner(System.in);
private static final boolean[] seatStatus = new boolean[21];
public static int getSeatFromUser() {
int seatNumber = -1;
do {
try {
System.out.print("\nEnter seat number: ");
String line = input.nextLine().trim();
try {
seatNumber = Integer.parseInt(line);
}catch(NumberFormatException nfe) {
throw new NotAValidSeatNumberValueExeption(line);
}
if(seatNumber < 0 || seatNumber > 20)
throw new SeatIndexOutOfBoundsException(line);
if (seatStatus[seatNumber])
throw new SeatAlreadyTakenException(line);
}catch(NotAValidSeatNumberValueExeption | SeatIndexOutOfBoundsException | SeatAlreadyTakenException ex) {
System.out.println(String.format("\nERROR: %s '%s'", ex.getClass().getSimpleName(),ex.getMessage()));
seatNumber = -1;
}
}while(seatNumber == -1);
seatStatus[seatNumber] = true;
return seatNumber;
}
}
更改班级以匹配:
class YourClass{
private static final HashSet<Integer> asientos = new HashSet(21);
public static int asientosReservados(int x) {
return asientos.add(x) ? 1 : 0;
}
}