使用Scanner类读取输入数据

时间:2014-03-25 04:19:28

标签: java

我对使用扫描仪类读取输入有疑问。通常它会这样。如果我使用print而不是println,我可以在同一行中获得输入

public class A {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        System.out.print("Enter loan amount:   ");
        double loanAmount = sc.nextDouble();
    }
}

现在我想以其他方式扩展扫描仪的使用,但我无法这样做。

public class A {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        String input = "";
        double val = 0.0;
        System.out.println(""Enter a command push n,add");
        Calculator xyz = new Calculator();
        while(true) {
            input = sc.next();
            if(input.equals("push")+val) {
               val = sc.nextDouble();
                xyz.push(val);
                abc.getValues();
            }
            if(input.equals("add"))
            xyz.add();

        }
    }
}

在上面我想在输入“push”后读​​取同一行中的值 例如,当我运行上面的代码时,我将得到如下的o / p

Enter a command

push
4
4.0

但我希望o / p为:

Enter a command

push 4
4.0

2 个答案:

答案 0 :(得分:0)

选项1

每一行都会有一个字和一个双字:

System.out.println("Enter a command");
final String command = sc.next();
final double value = sc.nextDouble();

Working example

选项2

行可以包含具有可变数量令牌的命令; 使用sc.nextLine()并手动解析输入:

final String input = sc.nextLine();
eval(input);

eval类似于:

private void eval(String input) {
    String[] parts = input.split("\\s+");
    switch (parts[0]) {
        case "push": {
            final double value = Double.parseDouble(parts[1]);
            stack.push(value);
            System.out.println(value);
            break;
        }
        case "pop": {
            System.out.println(stack.pop());
            break;
        }
        case "add": {
            System.out.println(stack.pop() + stack.pop());
            break;
        }
        case "exit": {
            hasNext = false;
            break;
        }
        default: {
            System.err.println("Invalid command");
            break;
        }   
    }
}

Working example

最后一个例子演示了一个接受序列的简单解释器,例如:

push 4
push 8
push 10
add
pop
exit

您也可以使用类似于第一个示例的代码来实现相同的目标:

  1. 调用sc.next()获取实际命令
  2. "翻译"命令
  3. 进行一系列sc.next*调用以接收特定于每个命令的令牌。
  4. 但我认为sc.nextLine()更易于管理,特别是如果您需要验证输入。

答案 1 :(得分:0)

试试这个: -

public class A{
    public static void main(String[] args) {
   Scanner sc = new Scanner(System.in);

   System.out.println("Enter a command");
   while(true){
    String val[]=sc.nextLine().split(" ");
    //System.out.println("push "+val[1]);
    System.out.println(Double.parseDouble(val[1]));

}
   }
   }

输出: -

Enter a command
push 4
4.0
push 5
5.0
push 6
6.0

希望它会对你有所帮助。