我正试图在一个涵盖数组的章节中完成一本书的练习。
练习提示用户输入1以在头等舱(座位1-5)中分配座位并输入2以在经济舱中分配座位(座位6-10)。我得到了那部分(我想是的!)
如果用户输入了一个号码(让我们说2)并且所有经济舱座位都已满(seats[5]
到seats[9]
为true
)我需要询问用户是否他想搬到头等舱。我被困在这里,试图弄清楚如何检查,在我提到的例子中,如何检查下一个不在头等舱中的座位(下一个'假')。
我还希望听到一些有关如何使代码更优雅和更优雅的建议。高效,可能会使用一些子数组(firstClassSeats[]
和economyClassSeats[]
)
我还在学习:)。
这是代码:
import java.lang.reflect.Array;
import java.util.Arrays;
import java.util.Scanner;
public class AirlineReservationSystem {
/* Number of seats on the plane */
private static final int NUMBER_OF_SEATS = 10;
public static void main(String[] args) {
Scanner input = new Scanner(System.in);
int firstClass = 0;
int economyClass = 5;
int[] firstClassSeats = {1,2,3,4,5};
int[] economyClassSeats = {6,7,8,9,10};
/* Initialize array of seats and fill with false to indicate empty */
boolean[] seats = new boolean[NUMBER_OF_SEATS];
Arrays.fill(seats, false);
while (isPlaneFull(seats) == false){
System.out.printf("%nPlease type 1 for First Class%n" +
"Please type 2 for Economy%n");
int choice = input.nextInt();
if (choice == 1){
if(seats[firstClass] == false){
seats[firstClass] = true;
firstClass++;
}
for(boolean seatNumber : seats)
System.out.printf("[%b]\t", seatNumber);
if ( isPlaneFull(seats) == true){
System.out.printf("%nThe plane is full. Next flight leaves in 3 hours");
}
}
else{
try{
if(seats[economyClass] == false)
{
seats[economyClass] = true;
economyClass++;
for(boolean number : seats)
System.out.printf("[%b]\t", number);
}
}
catch (ArrayIndexOutOfBoundsException e){
if (isPlaneFull(seats) == true){
System.out.printf("%nThe plane is full. Next flight leaves in 3 hours");
}
else
{
System.out.printf("%nAll economy seats are full%n");
}
}
}
}
}
public static boolean isPlaneFull(boolean[] array){
for(boolean b: array) if(!b) return false;
return true;
}
}
答案 0 :(得分:4)
要检查头等舱是否已满,您需要检查指向最后分配的头等舱座位的指针是否达到最大值,或者是否一个接一个地检查所有座位:
boolean firstClassFull = true;
for(int i=0; i<5; i++){
if(seats[i] == false){
firstClassFull = false;
seats[i] = true;
break;
}
}
经济舱也一样。
这归结为定义什么&#34;头等舱已满#34;意思是:这意味着一流的所有座位都被占用。为了检查这一点,您需要检查所有座位。
您的代码的想法是增加firstClass
变量,以便它代表下一个可用的头等舱座位:
if(seats[firstClass] == false)
但是,只有将变量限制为可接受的值(在您的情况下最多为4),才能执行此操作。所以你需要添加一个支票
if(seats[firstClass] == false && firstClass < 5 )
在任何情况下,检查所有头等舱座位可能会更加健壮,而不仅仅是检查应该是什么&#34;下一个可用&#34;,因为这样可以让某人取消他们的机票,并释放一个席位。
这些变量
int firstClass = 0;
int economyClass = 5;
错误地命名,它们表示该类的下一个可用座位,它们应相应地命名,例如:
int nextAvailableFirstClassSeat = 0;
int nextAvailableEconomyClassSeat = 5;
此外,每个类的起始索引将更好地处理为static final
变量,就像您的其他常量一样。
这或多或少是您其他变量的目的:
int[] firstClassSeats = {1,2,3,4,5};
int[] economyClassSeats = {6,7,8,9,10};
但是,您不需要以这种方式定义它们,您只需定义start
和end
。
结束上述两点,您可以用
替换它private static final int FIRST_CLASS_START = 0;
private static final int SECOND_CLASS_START = 5;
请注意,您实际上并不需要指定一个结尾,因为第一个类结束于第二个类开始,第二个类结束于平面结束。
另请注意,由于数组索引的编号从0
到length-1
,因此第一类和第二类的索引为0-4
和5-9
。
try-catch
阻止ArrayIndexOutOfBoundsException
的阻止是错误的。这种异常是unchecked exception,用于表示编程错误。尝试捕获它是没有意义的,因为您已经知道何时可以抛出它:即当您尝试访问其边界之外的数组时。因此,您可以而且应该只测试economyClass
是否小于seats.length
您的代码效率很低,因为您在收到用户的每次请求后都会调用isPlaneFull
。这是低效的,因为您每次都要重新扫描您的阵列。您不需要这样做,因为您可以在变量中存储已占用的座位数,每次分配新座位时都会计算增量,并简单地检查该变量是否等于最大值,而不是重新扫描一切。
此外,您还有一些重复的代码:打印出阵列的部分,以及测试飞机是否已满的部分,如果是,则宣布出发时间。您可以将代码的这些部分移到if-else
之外,以便它始终执行。
您不需要Arrays.fill(seats, false);
因为默认情况下数组是使用指定类型的默认值初始化的。对于boolean
,默认值为false
。
import java.util.Arrays;
import java.lang.reflect.Array;