如何将用户输入用于 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
保持为空,循环继续。
最后,roomTypeUserSelection
和 stayUserSelection
包含用户选择枚举,您可以在其中获取索引或字符串类型(例如 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
我需要先说我对编码非常陌生。我正在一所大学上一门课程,作为我在工作中的学徒。这是一周的一天,我已经走了大约 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
保持为空,循环继续。
最后,roomTypeUserSelection
和 stayUserSelection
包含用户选择枚举,您可以在其中获取索引或字符串类型(例如 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