解析输入并确定数据类型

时间:2017-07-01 19:28:16

标签: java java.util.scanner

我想从用户那里获取输入,然后想要找到它是Integer,float还是其他东西。直到现在我正在使用Scanner类。像Scanner scan1=new Scanner(System.in); String st= scan1.next();一样,然后我试图分别在int和float中解析输入(st)。但是通过这种方法,我无法满足“其他”条件。即输入既不是字符串,也不是浮点数。 以下是我尝试的代码: -

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;
}

这里我无法决定如何放置else条件来检查输入既不是字符串,也不是整数。

1 个答案:

答案 0 :(得分:3)

以下是重构代码的方法。我将解释以下更改:

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,而不是设置一个临时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!");
    }
  }
}

所有这些,我们在这里重新发明了轮子。 &#34;权利&#34;使用Scanner的方法是直接使用类型化方法 - 例如:

if (scanner.hasNextInt()) {
  int value = scanner.nextInt();
}

这可以避免需要进行任何手动类型检查或类似的繁忙工作 - 只需让Scanner为您进行验证。