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

时间:2016-09-11 13:46:17

标签: java arrays

我正试图在一个涵盖数组的章节中完成一本书的练习。

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

}

1 个答案:

答案 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};
    

    但是,您不需要以这种方式定义它们,您只需定义startend

  • 结束上述两点,您可以用

    替换它
    private static final int FIRST_CLASS_START = 0;
    private static final int SECOND_CLASS_START = 5;
    
  • 请注意,您实际上并不需要指定一个结尾,因为第一个类结束于第二个类开始,第二个类结束于平面结束。

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

ArrayIndexOutOfBoundsException异常

  • 重要提示:您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;