如何让StdIn.isEmpty()返回true?

时间:2017-04-13 20:41:32

标签: java eclipse algorithm stdin

我正在使用Algorithms Coursera算法课程中提供的普林斯顿图书馆的StdIn.isEmpty()方法,但我对它是如何工作感到困惑。我有声明

while (!StdIn.isEmpty())

附带一些代码来读取用户输入,但我似乎无法摆脱循环。根据我的理解,如果我按下输入而不输入任何文本,这应该意味着标准输入为空并且应该打破while循环。我查找了isEmpty的代码,但它没有澄清任何内容:

public static boolean isEmpty() {
    return !scanner.hasNext();
}

有人可以澄清标准输入是如何工作的,并帮助我解决我对这种方法的误解吗?

3 个答案:

答案 0 :(得分:0)

我认为在Mac上你可以使用CMD+D⌘+D)来标记shell输入的结束。请参阅:https://www.jetbrains.com/help/idea/debug-tool-window-console.html

  

键盘快捷键

     

⌘D键组合允许您发送EOF(文件结束),即   表示无法从数据源读取更多数据。

关于算法中提供的普林斯顿图书馆问题 - Coursera课程的第1部分,您可以使用他们的代码,特别是在课程import edu.princeton.cs.algs4.StdIn;中。使用该代码的实现可能不是最复杂的概念:

while (!StdIn.isEmpty()) {
     int p = StdIn.readInt();
     int q = StdIn.readInt();

     if (!uf.connected(p, q)) {
         uf.union(p, q);
         StdOut.println(p + " " + q);
     }
}

这就是我的所作所为:

  1. 在IntelliJ中创建新的Java项目
  2. 创建新的java包(将在src下)
  3. 为他们的示例创建一个新类,它将有一个主方法
  4. 在项目中创建了libs文件夹
  5. http://algs4.cs.princeton.edu/code/algs4.jar下载代码并将该jar放在libs文件夹中
  6. 将lib添加到项目 - 在IntelliJ的项目选项卡上,右键单击项目>打开模块设置>点击依赖项标签>点击' +' > JAR或目录...>从上面的libs文件夹中选择jar
  7. 我改变了上面的while循环中的代码,以便在shell上有更好的用户交互(在这里有创意 - 而不是使用isEmpty()使用检查p和q为0以标记输入结束,例如。
  8. 现在运行,只需右键单击具有主静态方法的类的代码,然后选择Run(CTRL + SHIFT + R)。

    如果你想在while循环之后编写更多代码,这将避免可怕的CMD + D以及与之相关的一些问题 - 例如,我添加了代码来检查2个对象是否连接:

    StdOut.println("Check if 2 objects are connected: ");
    try {
        Scanner reader = new Scanner(System.in);  // Reading from System.in
        System.out.println("Enter first object: ");
        int n = reader.nextInt(); // Scans the next token of the input as an int.
        System.out.println("Enter second object: ");
        int m = reader.nextInt(); // Scans the next token of the input as an int.
        StdOut.println(uf.connected(n, m) ? "Connected" : "Not Connected");
    } catch(Exception e) {
        // whatever...
    }
    

    这是解决问题的快速而肮脏的方法:

    package com.algorithms;
    
    import edu.princeton.cs.algs4.StdIn;
    import edu.princeton.cs.algs4.StdOut;
    import edu.princeton.cs.algs4.UF;
    
    import java.util.Scanner;
    
    public class Week1 {
        private static UF uf;
    
        public static void main(String[] args)
        {
            StdOut.println("Enter the total number of objects: ");
            int N = StdIn.readInt();
    
            StdOut.println("Enter the unions between any of those objects...");
    
            Week1.uf = new UF(N);
            while (true) {
    
                int p = StdIn.readInt();
                int q = StdIn.readInt();
    
                if (!uf.connected(p, q)) {
                    Week1.uf.union(p, q);
                    StdOut.println(p + " " + q);
                }
    
                if(p==0 && q==0) break;
            }
            checkIfConnected();
        }
    
        private static void checkIfConnected()
        {
            StdOut.println("Check if 2 objects are connected: ");
            try {
                Scanner reader = new Scanner(System.in);  // Reading from System.in
                System.out.println("Enter first object: ");
                int n = reader.nextInt(); // Scans the next token of the input as an int.
                System.out.println("Enter second object: ");
                int m = reader.nextInt(); // Scans the next token of the input as an int.
                StdOut.println(Week1.uf.connected(n, m) ? "Connected" : "Not Connected");
            } catch(Exception e) {}
        }
    }
    

答案 1 :(得分:0)

  

在读取每个数字之前,程序使用StdIn.isEmpty()方法检查输入流中是否还有其他数字。我们如何发出信号说我们没有更多数据要输入?按照约定,我们键入一个特殊的字符序列,称为文件结尾序列。不幸的是,我们在现代操作系统上通常遇到的终端应用程序对于这一至关重要的序列使用不同的约定。在本书中,我们使用Ctrl-D ...   计算机科学Sedgewick

因此,struct FloatContainer : CustomStringConvertible { var description: String { get { return f.description } } var f: Float } 实际上是isEmpty

此外,在终端应用程序中尝试isCtrl-D之前不要做任何事,这将使您没有布尔值,而是标准输入流请求输入。因此,当以下程序运行时:

StdIn.isEmpty()

,是在第一次确定条件public class Average { public static void main(String[] args) { // Average the numbers on standard input. double sum = 0.0; int n = 0; while (!StdIn.isEmpty()) { // Read a number from standard input and add to sum. double value = StdIn.readDouble(); sum += value; n++; } double average = sum / n; StdOut.println("Average is " + average); } } 而不是while (!StdIn.isEmpty)时弹出标准输入流。如果您随后键入一些数字,然后返回它们,从而导致标准输入流为非空,则程序将在while主体内跳转。通过测试

我发现是这种情况
StdIn.readDouble()

NaN表示n = 0,这意味着当身体不被触摸时。

答案 2 :(得分:0)

  1. Enter到下一行
  2. 丢失光标
  3. 返回窗口/光标,尝试按Ctrl + ZStdIn.isEmpty()将返回true

enter image description here