在 Java 中获取 StdInput 和 StdOutput 的语法应该是什么?
我需要从用户那里获取输入,这些输入可以是任何顺序和任何数据类型(int、float、string)。我的代码就是这样,但它不允许灵活地以随机顺序接受数据类型。
Scanner sc = new Scanner(System.in);
int x = sc.nextInt();
double y = sc.nextDouble();
sc.nextLine();
String s = sc.nextLine();
System.out.println("String: " + s);
System.out.println("Double: " + y);
System.out.println("Int: " + x);
无论数据类型如何,如何以任意顺序获取输入?
这取决于您想要输入什么。
但是您可以做的一件事是将输入作为字符串,然后检查字符串的内容。例如,您可以使用
parseInt()
和 parseDouble()
方法对数据类型进行跟踪和错误。像这样的东西:
try {
// Try to parse it as an integer
Integer.parseInt(input);
}
catch (NumberFormatException exc) {
try {
// Try to parse it as a double
Double.parseDouble(input);
}
catch (NumberformatException exc) {
// Else, it's a string
}
}
但是,下面有一个更优雅的方式:
Scanner sc = new Scanner(System.in);
while (true) { // Some condition
if (sc.hasNextInt()) {
int i = sc.nextInt();
System.out.println("int: " + i);
}
else if (sc.hasNextDouble()) {
double d = sc.nextDouble();
System.out.println("double: " + d);
}
else {
String s = sc.next();
System.out.println("string: " + s);
}
}
请注意,小数点分隔符取决于区域设置。
如果您想确定任意类型的数据类型,您唯一的选择(使用扫描仪时)是使用
nextLine()
(或 next()
)。这些方法返回一个字符串,您可以将其解析为所需的数据类型,例如:
String s = sc.nextLine();
// For an integer
int i = Integer.parseInt(s);
// For a double
double i = Double.parseDouble(s);
你可以做类似的事情,
Scanner in = new Scanner(System.in);
in.useDelimiter(" ");
while(in.hasNext()) {
String s = in.next();
try {
Double d = Double.valueOf(s);
d += 1;
System.out.print(d);
System.out.print(" ");
} catch(NumberFormatException e) {
StringBuffer sb = new StringBuffer(s);
sb.reverse();
System.out.print(sb.toString() + " ");
}
}
Scanner
有 hasNextInt
和 hasNextDouble
等方法来确定下一个标记是什么类型,因此您可以基于此进行分支:
Scanner sc = new Scanner(System.in);
while (true) {
if (sc.hasNextInt()) {
int i = sc.nextInt();
System.out.println("Int: " + i);
} else if (sc.hasNextDouble()) {
double d = sc.nextDouble();
System.out.println("Double: " + d);
} else {
String s = sc.next();
if (s.equals("END")) break; // stop condition
System.out.println("String: " + s);
}
}