Java 如何以任意顺序为程序分配输入?
我有四个输入到我的代码中,我想能够做的是在控制台中以我选择的任何顺序输入它们 所以我可以输入: t=20,d=100,t=500,d=100 或 d=100,t=20,d=100,t=500 因此,不管顺序如何,只要我输入“t=something”、“d=something”、t=“something”和d=“something”,它就会将正确的整数值赋给变量 这就是我到目前为止所做的:Java 如何以任意顺序为程序分配输入?,java,Java,我有四个输入到我的代码中,我想能够做的是在控制台中以我选择的任何顺序输入它们 所以我可以输入: t=20,d=100,t=500,d=100 或 d=100,t=20,d=100,t=500 因此,不管顺序如何,只要我输入“t=something”、“d=something”、t=“something”和d=“something”,它就会将正确的整数值赋给变量 这就是我到目前为止所做的: int t=keyboard.nextInt();int d=keyboard.nextInt();int
int t=keyboard.nextInt();int d=keyboard.nextInt();int D=keyboard.nextInt();int T=keyboard.nextInt();
我将如何实现这一点?如果您要逐个输入,请使用此 使用“开关”。只需将注释行替换为相应变量的赋值
String input = keyboard.nextLine();
switch (input.split(" = ")[0]) {
case "D":
// assign value to capital D
break;
case "T":
// code
break;
case "d":
// code block
break;
case "t":
// code block
break;
default:
// error message
}
如果您将整个
d=100、t=20、d=100、t=500作为一行输入,请使用以下命令:
String line = "d = 100, t = 20, D = 100, T = 500"; // substitute nextLine() here
String[] split_line = line.split(", ");
for (String input : split_line){
switch (input.split(" = ")[0]) {
case "D":
System.out.println(input.split(" = ")[1]);
break;
case "T":
// code
break;
case "d":
// code block
break;
case "t":
// code block
break;
}
}
一个简单的解决办法是
public final class Example {
public static void main(String... args) {
final int variablesExpected = 3;
final Map<String, Integer> variables = new HashMap<>();
final Scanner keyboard = new Scanner(System.in);
// read until there are 3 varibles
while(variables.size() != variablesExpected) {
// read a line from the user
final String line = keyboard.nextLine();
// split it into 2 Strings (hopefully): varible name and varible value
final String[] expression = line.split("\\s*=\\s*");
if (expression.length == 2) {
// expression[0] is the variable name
// Integer.valueOf(expression[1]) is its integer value
variables.put(expression[0], Integer.valueOf(expression[1]));
}
}
System.out.println(variables);
}
}
它更灵活,不强制用户输入您定义的确切变量名。如果是要求,请定义一个集合
,并针对每个输入检查表达式的第一部分是否出现在该集合
中
public final class Example {
public static void main(String... args) throws Throwable {
final Map<String, Integer> variables = new HashMap<>();
final Scanner keyboard = new Scanner(System.in);
final Set<String> expectedVariableNames = new HashSet<>(Arrays.asList("t", "T", "d", "D"));
while(variables.size() != expectedVariableNames.size()) {
final String line = keyboard.nextLine();
final String[] expression = line.split("\\s*=\\s*");
if (expression.length == 2 && expectedVariableNames.contains(expression[0])) {
variables.put(expression[0], Integer.valueOf(expression[1]));
}
}
System.out.println(variables);
}
}
我首先按照老程序员的建议,把这行作为一个字符串来读。您可以使用
split()
和substring()
方法分析字符串:
String input = keyboard.nextLine();
// Per your example, would be something like "t=20,d=100,T=500,D=100"
int t = 0, d = 0, T = 0, D = 0;
String[] inputArray = input.split(","); // Splits the input string at each comma & returns an array
for(String s : inputArray) {
if(s.startsWith("t"))
t = Integer.parseInt(s.substring(2));
else if(s.startsWith("d"))
d = Integer.parseInt(s.substring(2));
else if(s.startsWith("T"))
T = Integer.parseInt(s.substring(2));
else if(s.startsWith("D"))
D = Integer.parseInt(s.substring(2));
}
您可能会使用
映射
而不是显式变量。首先,我会删除=符号之间的间距,然后将整行作为字符串阅读并解析。谢谢,这是我的第一堂java课(python背景),我们的教授没有讨论与您提到的内容相关的任何内容。java新手会知道有没有更简单的解决方案?@John字符串类是您经常使用的一个,因此,我希望您会发现,在“默认”处理无效输入的早期学习它的一些方法会有很大的好处。@RoddyofFrozenpeas补充道。input.split
示例输入行将为您提供[“t”,“20,d”,“100,t”(等)
-您必须先用逗号分割,然后等分。@StephenP它应该接受整行还是只接受其中一行?OP不明确,但问题中的示例是t=20,d=100,t=500,d=100
,我认为这是一个输入行,由逗号分隔的赋值列表组成。我个人会将其编码为允许在逗号和等号周围使用可选空格,就像Andrews answer在正则表达式中所做的那样。
t = 3
d = 3
D // invalid
d = 45 // overrides d = 3
D = 12
l = 34 // invalid
T = 12
{t=3, d=45, D=12, T=12}
String input = keyboard.nextLine();
// Per your example, would be something like "t=20,d=100,T=500,D=100"
int t = 0, d = 0, T = 0, D = 0;
String[] inputArray = input.split(","); // Splits the input string at each comma & returns an array
for(String s : inputArray) {
if(s.startsWith("t"))
t = Integer.parseInt(s.substring(2));
else if(s.startsWith("d"))
d = Integer.parseInt(s.substring(2));
else if(s.startsWith("T"))
T = Integer.parseInt(s.substring(2));
else if(s.startsWith("D"))
D = Integer.parseInt(s.substring(2));
}