gpt4 book ai didi

java - 检查数组中的下一个 'false' 元素

转载 作者:行者123 更新时间:2023-12-01 18:02:45 26 4
gpt4 key购买 nike

我正在尝试完成一本书中涉及数组的章节中的练习。

练习提示用户输入 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;
}

}

最佳答案

怎么做

要检查头等舱是否已满,您需要检查指向最后分配的头等舱座位的指针是否位于最大位置,或者是否所有座位都已满:

boolean firstClassFull = true;
for(int i=0; i<5; i++){
if(seats[i] == false){
firstClassFull = false;
seats[i] = true;
break;
}
}

经济舱也是如此。

这归结为定义“头等舱已满”的含义:这意味着头等舱的所有座位都已满。为了检查这一点,您需要检查所有座位。

你的代码有什么问题

代码的想法是增加您的 firstClass 变量,以便它代表下一个可用的头等舱座位:

if(seats[firstClass] == false)

但是,只有将该变量限制为可接受的值(在您的情况下最多为 4),您才能执行此操作。所以你需要添加一个检查

if(seats[firstClass] == false && firstClass < 5 ) 

无论如何,检查所有头等舱座位可能会更可靠,而不是仅仅检查“下一个可用”的座位,因为这将允许某人取消机票并释放座位.

有关代码的其他注释

变量及其名称

  • 这些变量

    int firstClass = 0;
    int economyClass = 5;

    命名错误,它们表示类(class)的下一个可用座位,应相应命名,例如:

    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;
  • 请注意,您实际上不需要指定结束位置,因为头等舱在二等舱开始处结束,而二等舱在飞机末端结束。

  • 另请注意,由于数组索引从 0length-1 编号,因此第一类和第二类的索引为 0-4 5-9

ArrayIndexOutOfBoundsException

  • 重要提示:您捕获 ArrayIndexOutOfBoundsExceptiontry-catch block 是错误的。这种异常是unchecked exception ,旨在表示编程错误。 try catch 它是没有意义的,因为您已经知道什么时候可以抛出它:即当您尝试访问数组边界之外的时候。因此,您可以而且应该简单地测试 economyClass 是否小于 seats.length

效率低下

  • 您的代码效率稍低,因为您在每次用户发出请求后都会调用 isPlaneFull。这是低效的,因为您每次都需要重新扫描阵列。您不需要这样做,因为您可以将占用席位的计数存储在变量中,每次分配新席位时增加该计数,并简单地检查该变量是否等于最大值,而不是重新扫描所有内容。

  • 此外,您还有一些重复的代码:打印出数组的部分,以及测试飞机是否满员的部分,如果满员则宣布起飞时间。您可以将代码的这些部分移到 if-else 之外,以便它始终得到执行。

  • 您不需要 Arrays.fill(seats, false); 因为默认情况下数组会使用指定类型的默认值进行初始化。对于boolean,默认值为false

  • 因此您也不需要import java.util.Arrays;
  • 您不需要import java.lang.reflect.Array;

关于java - 检查数组中的下一个 'false' 元素,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39436732/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com