【问题标题】:How do i increment static variables in java我如何在java中增加静态变量
【发布时间】:2021-02-08 11:00:40
【问题描述】:

我对 java 很陌生,但我对 c++ 和 python 有很好的经验。所以,我正在做一个问题,我需要实施一个飞机预订系统,它执行以下操作 -

1.将所有座位初始化为未占用(false)

2.询问输入(生态或头等舱)

3.检查座位是否未被占用

4.如果座位没有被占用分配座位,否则寻找下一个座位

5.如果经济舱已订满,询问用户是否想升到头等舱

6.如果用户是否定的显示消息“下一个飞机在 3 小时内”

但是,

package oop;
import java.util.Arrays;
import java.util.Scanner;

public class AirplaneBooking {

    private final static int MAX_ECO_SEATS = 5;
    private final static int MAX_FIRST_CLASS_SEATS = 3;
    private final static boolean[] ECO_SEATS = new boolean[MAX_ECO_SEATS];
    private final static boolean[] FIRST_CLASS_SEATS = new boolean[MAX_FIRST_CLASS_SEATS];
    private static int current_eco_seat = 0;
    private static int current_first_class_seat = 0;

    public static void initialilze_seats(boolean[] first_class_seats, boolean[] eco_class_seats){
        Arrays.fill(first_class_seats, Boolean.FALSE);
        Arrays.fill(eco_class_seats, Boolean.FALSE);
    }

    public static void display(boolean[] seats){
        System.out.print("[");
        for(boolean seat : seats){
            System.out.print(seat + ",");
        }
        System.out.println("]");
    }

    public static void book_seat(boolean [] seats, int current_seat){
        seats[current_seat] = true;
        current_seat++;
        System.out.println(current_seat);
    }


    public static int user_input() {
        Scanner input = new Scanner(System.in);
        System.out.print("Enter 1 for Economy class or 2 for First class : ");
        int user_seat_prefrence = input.nextInt();
        if (user_seat_prefrence == 1){
            if(current_eco_seat < MAX_ECO_SEATS){
                book_seat(ECO_SEATS, current_eco_seat);
            }
            else{
                System.out.println("Looks like eco seats are full, would you like to book for first class insted(1/0) ?");
                Scanner next_input = new Scanner(System.in);
                int user_next_seat_prefrence = next_input.nextInt();
                if (user_next_seat_prefrence == 1){
                    book_seat(FIRST_CLASS_SEATS, current_first_class_seat);
                    user_seat_prefrence = 2;
                }
                else{
                    System.out.println("next flight leaves in 3 hrs");
                }
            }

        }

        else if  (user_seat_prefrence == 2){
            if (current_first_class_seat < MAX_FIRST_CLASS_SEATS){
                book_seat(FIRST_CLASS_SEATS, current_first_class_seat);
            }
            else{
                System.out.println("Looks like first class seats are full, would you like to book economy instead?(1/0)");
                int user_next_seat_prefrence = input.nextInt();
                if (user_next_seat_prefrence == 1){
                    book_seat(ECO_SEATS, current_eco_seat);
                    user_seat_prefrence = 1;
                }
                else{
                    System.out.println("Next flight leaves in 3hrs");
                }

            }
        }

        else {
            System.out.println("Enter valid option");
        }

        return user_seat_prefrence;
    }

    public static void print_boarding_pass(int user_seat_prefrence){
        if (user_seat_prefrence == 1){
            System.out.println("eco");
            System.out.println(current_eco_seat - 1);
        }
        else{
            System.out.println("first class");
            System.out.println(current_first_class_seat - 1); 
        }
    }
    public static void main(String args[]){
        initialilze_seats(FIRST_CLASS_SEATS, ECO_SEATS);
        display(FIRST_CLASS_SEATS);
        display(ECO_SEATS);
        while(true){
            int user_seat_prefrence = user_input();
            print_boarding_pass(user_seat_prefrence);    
            display(FIRST_CLASS_SEATS);
            display(ECO_SEATS);
            System.out.print("book another seat:");
            Scanner choice = new Scanner(System.in);
            boolean book_another_seat = choice.nextBoolean();
            if (book_another_seat == false)
                break;
         
        }
    }

}

我遇到此代码的问题是如果生态舱的座位(例如)已满,程序应该询问我是否要预订头等舱并等待我的输入,如果我按下1 它应该在头等舱预订,但程序不会等待我的输入,而是转到 else 语句。

另外,我使用static 变量current_eco_seatcurrent_first_class_seat 来跟踪当前预订的座位,并将该静态变量传递给book_seat 函数,然后程序预订座位并递增current_eco_seatcurrent_first_class_seat(取决于通过的)以便可以在下一次互动中预订下一个座位。但是静态变量根本不会增加。

这些是我对程序唯一的问题。

感谢任何帮助,谢谢

【问题讨论】:

  • Java 是按值传递原语的,因此您的 book_seat 方法会增加它自己的 current_seat 变量。你的静态变量没有改变。如果你想增加你的静态变量直接做; current_eco_seat++;。不需要通过 book_seat 方法发送。
  • 如果你真的想模仿C的指针语义,你可以将你的静态变量作为单元素数组(int[]),将它传递给函数,然后增加数组内的元素。但它不是 Java 中的模式。
  • 被认为有害的静态变量

标签: java arrays while-loop static boolean


【解决方案1】:

由于 Java 按值调用方法,

您关于静态的问题是您将current_seat 的值传递给book_seat 方法,因此从该方法返回后更改该值不会影响该变量。

要解决它,只需调用该方法,不要传递您的静态变量。它是静态的,因此您可以从任何地方访问它。

即:

public static void book_seat(boolean [] seats){
        seats[current_seat] = true;
        current_first_class_seat++;
        System.out.println(current_seat);
    }

【讨论】:

  • Java 只能按值调用。
【解决方案2】:

您不需要坚持增加确切的变量,只需执行以下操作:

  1. 使book_seat() 返回递增值
    public static int book_seat(boolean [] seats, int current_seat) {
        seats[current_seat] = true;
        System.out.println(current_seat + 1);
        return current_seat + 1;
    }
  1. 将返回值设置为current_first_class_seatcurrent_eco_seat
            if (current_first_class_seat < MAX_FIRST_CLASS_SEATS){
                current_first_class_seat = book_seat(FIRST_CLASS_SEATS, current_first_class_seat);
            }
            else{
                System.out.println("Looks like first class seats are full, would you like to book economy instead?(1/0)");
                int user_next_seat_prefrence = input.nextInt();
                if (user_next_seat_prefrence == 1){
                    current_eco_seat = book_seat(ECO_SEATS, current_eco_seat);
                    user_seat_prefrence = 1;
                }
                else{
                    System.out.println("Next flight leaves in 3hrs");
                }

            }

然后您可以使用book_seat() 来处理您之前计划的经济舱和头等舱预订。

【讨论】:

    【解决方案3】:
    1. 检查 Inout 流

    不确定您的问题是与“静态”变量有关,还是与“如何处理输入流?”有关。

    关于:

    如果我按 1,它应该在头等舱预订,但程序不会等待我的输入,而是继续执行 else 语句。

    在再次阅读之前,您应该考虑“刷新”输入流。 flush-clear-system-in-stdin-before-reading

    1. 方法参数用法

    另一方面,这种方法是错误的

        public static void book_seat(boolean [] seats, int current_seat){
        seats[current_seat] = true;
        current_seat++;
        System.out.println(current_seat);
    }
    

    此命令没有任何影响,但会向用户打印信息。您在调用者“current_eco_seat”中使用的变量根本不会改变。

    【讨论】:

    • 嘿,谢谢你的回复。如何刷新输入流?我试图阅读您链接的答案,不清楚
    猜你喜欢
    • 2019-10-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-06-23
    • 2011-12-29
    • 1970-01-01
    • 1970-01-01
    • 2012-09-12
    相关资源
    最近更新 更多