以任何顺序接受来自用户的任何数据类型(int,float,string)

时间:2017-06-27 20:41:44

标签: java

在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);

无论数据类型如何,我如何以任何顺序获取输入?

5 个答案:

答案 0 :(得分:2)

这取决于您对输入的要求。

但是您可以做的一件事是将输入作为字符串,然后检查字符串的内容。例如,您可以使用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);
    }
}

请注意,小数点分隔符取决于区域设置。

答案 1 :(得分:0)

如果要确定任意类型的数据类型,则唯一的选择(使用扫描程序时)是使用nextLine()(或next())。这些方法返回一个String,您可以将其解析为所需的数据类型,例如:

String s = sc.nextLine();
// For an integer
int i = Integer.parseInt(s);
// For a double
double i = Double.parseDouble(s);

答案 2 :(得分:0)

你可以使用扫描仪的hasNext()方法。只需检查API: https://docs.oracle.com/javase/7/docs/api/java/util/Scanner.html

import java.util.Scanner;

public class Solution {

    public static void main(String[] args) {
            Scanner sc=new Scanner(System.in);
            int x;
            double y;
            String s;
            while(sc.hasNext()) {
                  if (sc.hasNextInt()) {
                         x = sc.nextInt();
                  } else if (sc.hasNextDouble()) {
                         y = sc.nextDouble();
                  } else if (sc.hasNextLine()) {
                         y = sc.nextNextLine();
                  }
                   // and so on...
            }
    }
}

答案 3 :(得分:0)

Scanner包含hasNextInthasNextDouble等方法来确定下一个令牌的类型,因此您可以根据该分支进行分支:

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

答案 4 :(得分:0)

你可以做点什么,

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() + " ");
    }
}