如何将用户输入用于 Java 中二维数组中的 select 数据?

How do I use user input to select data from a 2D array in Java?

我需要先说我对编码非常陌生。我正在一所大学上一门课程,作为我在工作中的学徒。这是一周的一天,我已经走了大约 7 周了。我们正在做 Java,我们或多或少地学习了基础知识,现在我们被分配创建一个简单的酒店预订系统。我们不需要展示,也不需要根据我们的 OOP 技术评分。这一切只需要在 class.

内完成

说完这些,继续手头的事情。

一部分作业要求我们允许用户select一种房型(阁楼、特大床房等),然后select他们想住多少天(7或 14 天)。我的导师说最简单的方法是为每个所需的信息位设置一个变量,但他说这看起来会非常混乱。然后他说最难的方法是使用二维数组,所以我想尝试一下。这就是数组的样子:

int[][] roomSel = new int[6][2];
        roomSel[0][0] = 700;
        roomSel[0][1] = 1400;
        roomSel[1][0] = 630;
        roomSel[1][1] = 1260;
        roomSel[2][0] = 560;
        roomSel[2][1] = 1120;
        roomSel[3][0] = 490;
        roomSel[3][1] = 980;
        roomSel[4][0] = 1120;
        roomSel[4][1] = 2240;
        roomSel[5][0] = 350;
        roomSel[5][1] = 700;

第一个数字表示房间类型(有 6 种类型),第二个数字表示他们希望入住的天数(0 = 7 天,1 = 14 天)。他们持有的数据是他们 selection 的价格。

所以我的问题是,我将如何使用用户输入 select 来自该数组的适当数据?我已经进行了相当多的谷歌搜索,我发现的所有内容都在谈论使用用户输入来填充数组。这不是我需要的,因为数组已经填充。

如果我说的不对,请告诉我,我会尽力进一步澄清我的问题。

在此先感谢您提供的所有帮助。

如果我没理解错的话,你的目标是找到给定房间类型的价格和房间的入住天数。为此,您根本不需要数组。

对房间类型使用 hashmap。键对应于房间类型,值对应于每天的价格。示例:Hashmap={0:100, 1:200, 2:100, 3:200, 4:100, 5:200}.

根据用户输入,即您对该哈希图的键,获取其值,即每天的价格。将此值乘以 'number of days'

的用户输入

读取用户输入可以通过读取 System.in 来完成。您可能想 java.util.Scanner 试一试。打印一些文本,要求用户输入一个选项并使用 java.util.Scanner#nextInt() 读取值。确保该值在允许的范围内。

要求两个值,第一个是房间类别,第二个是持续时间。

老实说,你的数组对我来说没有多大意义。它似乎包含可能的选择和组合的预先计算值。不确定,为什么要这样做。

当你有类别和持续时间时,你可以很容易地计算价格。您所要做的就是每天为该类别找到正确的价格。您 可以 为此使用一个数组,例如。 price[0]=100。但是您的程序将如何处理它?

是否只打印最终价格?你想跟踪记录,...?

入门指南:

    public static void main(String[] args) {
    Integer[][] roomSel = new Integer[6][2];
    roomSel[0][0] = 700;
    roomSel[0][1] = 1400;
    roomSel[1][0] = 630;
    roomSel[1][1] = 1260;
    roomSel[2][0] = 560;
    roomSel[2][1] = 1120;
    roomSel[3][0] = 490;
    roomSel[3][1] = 980;
    roomSel[4][0] = 1120;
    roomSel[4][1] = 2240;
    roomSel[5][0] = 350;
    roomSel[5][1] = 700;


    Scanner scanner = new Scanner(System.in);

    System.out.println("Please select room type: ");
    int roomType = scanner.nextInt();

    System.out.println("Please enter 0 for 7 days and 1 for 14 days: ");
    int days = scanner.nextInt();

    System.out.println("Price is " + roomSel[roomType][days]);
}

这个例子非常简单,需要改进 ;) 玩得开心。

正如您所说,您是编码新手,我想您听说过枚举。这是保持代码整洁的好方法,因为枚举是常量列表,如不可更改的变量,在您的情况下,它们可以包含一些有关房间类型和停留天数的信息,而不是仅使用整数作为数组索引,这对房型或入住天数。

您可以使用如下枚举,而不是使用评论或提醒您房间类型 1 是双人房的东西:

房型:

enum RoomType{
    SINGLE(0, "Single Room"),
    DOUBLE(1, "Double Room"),
    TRIPLE(2, "Triple Room"),
    QUEEN(3, "Queen"),
    KING(4, "King"),
    SUITE(5, "Suite");

    private final int value;
    private final String type;

    RoomType(final int val, final String type) {
        this.value = val;
        this.type = type;
    }

    public int getValue() {
        return value;
    }

    public static RoomType getByValue(int val) {
        for(RoomType e : values()) {
            if(e.value == val) return e;
        }
        return null;
    }

    public String toString(){
        return value + "\t\t: " + type ;
    }
}

入住天数:

enum Stay{
    SHORT(0, "7 Days"),
    LONG(1, "14 Days");

    private final int value;
    private final String type;

    Stay(final int value, final String type) {
        this.value = value;
        this.type = type;
    }

    public static Stay getByValue(int val) {
        for(Stay e : values()) {
            if(e.value == val) return e;
        }
        return null;
    }

    public int getValue() {
        return value;
    }

    public String toString(){
        return value + "\t\t: " + type ;
    }
}

上面的枚举是做什么的?它们为 RoomType 和 Stay 定义常量值。它们可以是 return 整数(例如数组的索引)或可用于打印菜单的字符串。

您可以在以下主要方法中使用枚举:

public class Main {
    public static void main(String[] args) throws Exception {
        int[][] roomSel = new int[RoomType.values().length][Stay.values().length];
        roomSel[RoomType.SINGLE.getValue()][Stay.SHORT.getValue()] = 350;
        roomSel[RoomType.SINGLE.getValue()][Stay.LONG.getValue()] = 700;
        roomSel[RoomType.DOUBLE.getValue()][Stay.SHORT.getValue()] = 490;
        roomSel[RoomType.DOUBLE.getValue()][Stay.LONG.getValue()] = 980;
        roomSel[RoomType.TRIPLE.getValue()][Stay.SHORT.getValue()] = 560;
        roomSel[RoomType.TRIPLE.getValue()][Stay.LONG.getValue()] = 1120;
        roomSel[RoomType.QUEEN.getValue()][Stay.SHORT.getValue()] = 630;
        roomSel[RoomType.QUEEN.getValue()][Stay.LONG.getValue()] = 1260;
        roomSel[RoomType.KING.getValue()][Stay.SHORT.getValue()] = 700;
        roomSel[RoomType.KING.getValue()][Stay.LONG.getValue()] = 1400;
        roomSel[RoomType.SUITE.getValue()][Stay.SHORT.getValue()] = 1120;
        roomSel[RoomType.SUITE.getValue()][Stay.LONG.getValue()] = 2240;

        RoomType roomTypeUserSelection = null;
        Stay stayUserSelection = null;

        Scanner scanner = new Scanner(System.in);
        while (roomTypeUserSelection == null) {
            System.out.println("-- ROOM TYPES --");
            for (RoomType rt : RoomType.values()) {
                System.out.println(rt);
            }
            System.out.println("Please select room type: ");
            String roomTypeStr = scanner.nextLine();
            try {
                roomTypeUserSelection = RoomType.getByValue(Integer.parseInt(roomTypeStr));
            }catch(Exception e){ }
            if (roomTypeUserSelection==null){
                System.out.println("Invalid User Input. Try again");
            }
        }

        while (stayUserSelection == null) {
            System.out.println("-- Stay Days --");
            for (Stay stay : Stay.values()) {
                System.out.println(stay);
            }
            System.out.println("Please select how many days to stay: ");
            String stayStr = scanner.nextLine();
            try {
                stayUserSelection = Stay.getByValue(Integer.parseInt(stayStr));
            }catch(Exception e){ }
            if (stayUserSelection==null){
                System.out.println("Invalid User Input. Try again");
            }
        }
        System.out.println("Room Type : " + roomTypeUserSelection.toString());
        System.out.println("Stay for  : " + stayUserSelection.toString());
        System.out.println("Total Cost : " + roomSel[roomTypeUserSelection.getValue()][stayUserSelection.getValue()]);
    }
}

看看索引是如何为数组的每个地方选择的:roomSel[RoomType.SINGLE.getValue()][Stay.SHORT.getValue()]翻译成roomSel[0][0].

然后你可以做一个 while 循环,直到用户选择一个有效的类型。对其值 RoomType.values() 的 Enum 迭代会为 Enum 上的每个值调用 toString() 方法并打印菜单。然后将用户输入(作为 String * )解析为 Integer,如果失败:用户输入非整数值或 b.User 输入枚举值之外的值,roomTypeUserSelection 保持为空,循环继续。

最后,roomTypeUserSelectionstayUserSelection 包含用户选择枚举,您可以在其中获取索引或字符串类型(例如 3 或 Queen)。

上述程序的示例输出是:

-- ROOM TYPES --
0       : Single Room
1       : Double Room
2       : Triple Room
3       : Queen
4       : King
5       : Suite
Please select room type: 
4
-- Stay Days --
0       : 7 Days
1       : 14 Days
Please select how many days to stay: 
2
Invalid User Input. Try again
-- Stay Days --
0       : 7 Days
1       : 14 Days
Please select how many days to stay: 
1
Room Type  : 4      : King
Stay for   : 1      : 14 Days
Total Cost : 1400