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

标签 java java.util.scanner

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

相关文章:

java - 从文本文件中提取的数据存储在变量中时出现错误

java - 从文件输入邻接矩阵

java - 读取文本文件并获取每行的长度,同时将它们添加到长度正确的字符串中时出现问题

java - 使用 Scanner 从文件中读取对象

java - 如何重新启动流

java - 打印最后出现的位置(打印错误)

java - Gson:跳过节点级别进行序列化

java - 与扫描器类混淆 -> nextLine()

java - 在Java中播放声音文件

java - 尝试编写一个使用 OutputStream 写入文本文件的循环