我想从用户那里获取输入,然后想找到它是整数、浮点还是其他。到目前为止,我正在使用 Scanner 类。喜欢Scanner scan1=new Scanner(System.in);
String st= scan1.next();
然后我尝试分别解析 int 和 float 中的输入(st)。但用这种方法我无法满足“其他”条件。即当输入既不是字符串、整数也不是 float 时。
下面是我尝试过的代码:-
public String checkInput() {
String statement = "This input is of type ";
String inputType;
Scanner scan1 = new Scanner(System.in);
String st = scan1.next();
scan1.close();
inputType = st.getClass().getSimpleName();
try {
Float numFloat = Float.parseFloat(st);
inputType = numFloat.getClass().getSimpleName();
} catch (NumberFormatException e) {
}
try {
Integer numInt = Integer.parseInt(st);
inputType = numInt.getClass().getSimpleName();
} catch (NumberFormatException e) {
}
return statement + inputType;
}
这里我无法决定如何放置其他条件来检查输入既不是字符串、 float 也不是整数。
最佳答案
这是我将如何重组您的代码。我将在下面解释这些更改:
private static final String STATEMENT = "This input is of type ";
public static String checkInput(Scanner scanner) {
if (scanner.hasNextFloat()) {
return STATEMENT + Float.class.getSimpleName();
else if (scanner.hasNextInt()) {
return STATEMENT + Integer.class.getSimpleName();
}
return STATEMENT + "UNKNOWN";
}
- 首先,我们拉
statement
进入 constant ,因为它没有被改变。 - 其次,我们通过
Scanner
作为参数,而不是构造一个新的。选择这种方式的原因有很多,但原则之一是您应该避免创建多个Scanner
实例读取System.in
- 通常你会创建这样一个Scanner
在你的main()
方法并将其传递给需要使用它的方法和类。 - 接下来,我们不直接从扫描仪读取,而是使用
has*()
无需前进即可检查扫描仪状态的方法。这改变了checkInput()
的语义,因为当它返回时,正在检查的输入仍在扫描仪中,但这与名为check...()
的方法更一致。 - 它应该检查,而不是改变状态。因为您的实现调用.next()
您会丢失实际提供的输入,这可能是不可取的。 - 最后,我们
return
从每个 block 内部,而不是设置临时inputType
变量并在最后返回它。
您的main()
方法现在可能如下所示:
public static void main(String[] args) {
// using try-with-resources so we don't have to call .close()
try (Scanner scanner = new Scanner(System.in)) {
System.out.println(checkInput(scanner));
String input = scanner.next(); // this actually advances the scanner
System.out.println("You input: " + input);
}
}
<小时/>
更进一步,您可能更喜欢 checkInput()
返回 Class<?>
而不是String
,然后单独构建您的语句。这将使您能够以不同的方式处理输入。例如:
public static Class<?> inputType(Scanner scanner) {
if (scanner.hasNextFloat()) {
return Float.class;
else if (scanner.hasNextInt()) {
return Integer.class;
}
// add other types as needed
return String.class;
}
public static void main(String[] args) {
try (Scanner scanner = new Scanner(System.in)) {
Class<?> inputType = inputType(scanner);
String input = scanner.next();
System.out.println("You input: " + input);
if (inputType.equals(Integer.class)) {
System.out.prinln("That's a valid integer!");
}
}
}
<小时/>
综上所述,我们正在重新发明轮子。 “正确”的使用方式Scanner
是直接使用类型化方法 - 例如:
if (scanner.hasNextInt()) {
int value = scanner.nextInt();
}
这避免了需要进行任何手动类型检查或类似的繁琐工作 - 只需让 Scanner
为您进行验证。
关于java - 解析输入并确定数据类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44864642/