扫描仪输入 - 输入流指示器的结束

时间:2013-12-21 19:42:47

标签: java java.util.scanner

我想做以下事情:将数字读入堆栈; 逐个读出堆栈中的数字; 查找每个数字和打印结果的平方根

//need a stack class 
import java.util.Iterator;
import java.util.Stack;
import java.io.*;
import java.util.*;
import java.lang.Math;


public class Root { 
    public static void main (String[] args) {

        Scanner inscan  = new Scanner(System.in);
        PrintWriter out = new PrintWriter(System.out);

        Stack<Integer> stk = new Stack<Integer>(); 
        //Iterator iterate = stk.iterator();

        //Read the input stream and push them onto the stack
        while ( (inscan.hasNext()) ){                        //LOOP1
            stk.push(inscan.nextInt());     
        }
        //Pop contents of stack one by one and find square root 
        while ( ! stk.isEmpty() ) {
            int num = stk.pop();
            double root = Math.sqrt(num);
            out.printf("%.4f\n",root);
        }
        inscan.close();
        out.flush();

    }
}

问题在于阅读输入( inscan.hasNext())。 输入控制台上的最后一个数字后,程序仍然希望我提供输入 - 保持等待。

如何让程序知道我输入输入/我应该更改上面的LOOP1吗?

3 个答案:

答案 0 :(得分:4)

您也可以使用标记输入来终止循环,即计算中未使用的输入。 e.g

while ( (inscan.hasNext()) ){
    String val = inscan.next();
    if(val.equals("!"))
        break;                      
    stk.push(Integer.parseInt(val));     
}

更新:循环在输入'!'

时终止

答案 1 :(得分:3)

您还可以在一行中输入所有文本,并按照您想要的任何分隔符进行分割:

//Read the input stream and push them onto the stack
for(String str: inscan.nextLine().split(" "))
    stk.push(Integer.parseInt(str));

实施例

Input:  1 4 9 16 25
Output: 5.0000
        4.0000
        3.0000
        2.0000
        1.0000

答案 2 :(得分:2)

<强> [编辑]

System.in永远不会关闭;因此hasNext()会产生infinite loop

CTRL + D (linux)或 Ctrl + Z + Enter (Windows)发送EOF以关闭它。