gpt4 book ai didi

java - 解析输入并确定数据类型

转载 作者:行者123 更新时间:2023-12-01 20:20:20 25 4
gpt4 key购买 nike

我想从用户那里获取输入,然后想找到它是整数、浮点还是其他。到目前为止,我正在使用 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com