17

代码来自 http://algs4.cs.princeton.edu/11model/BinarySearch.java.html算法教科书。

import java.util.Arrays;

public class BinarySearch {

    // precondition: array a[] is sorted
    public static int rank(int key, int[] a) {
        int lo = 0;
        int hi = a.length - 1;
        while (lo <= hi) {
            // Key is in a[lo..hi] or not present.
            int mid = lo + (hi - lo) / 2;
            if      (key < a[mid]) hi = mid - 1;
            else if (key > a[mid]) lo = mid + 1;
            else return mid;
        }
        return -1;
    }

    public static void main(String[] args) {
        int[] whitelist = In.readInts(args[0]);

        Arrays.sort(whitelist);

        // read key; print if not in whitelist
        while (!StdIn.isEmpty()) {
            int key = StdIn.readInt();
            if (rank(key, whitelist) == -1)
                StdOut.println(key);
        }
    }
}

我收到这个错误

$ javac BinarySearch.java 
BinarySearch.java:44: cannot find symbol
symbol  : variable In
location: class BinarySearch
        int[] whitelist = In.readInts(args[0]);
                          ^
BinarySearch.java:49: cannot find symbol
symbol  : variable StdIn
location: class BinarySearch
        while (!StdIn.isEmpty()) {
                ^
BinarySearch.java:50: cannot find symbol
symbol  : variable StdIn
location: class BinarySearch
            int key = StdIn.readInt();
                      ^
BinarySearch.java:52: cannot find symbol
symbol  : variable StdOut
location: class BinarySearch
                StdOut.println(key);
                ^
4 errors
4

7 回答 7

33

Classes StdInStdOut并且In不是标准 Java 库的一部分。它们是与普林斯顿课程一起提供的支持课程。

从源代码中链接的1.1 Programming Model页面:

标准输入和标准输出。StdIn.java并且StdOut.java是用于从标准输入读取数字和文本并将数字和文本打印到标准输出的库。我们的版本比相应的 Java 版本具有更简单的界面(并提供了一些技术改进)。

...

In.java并且Out.java是面向对象的版本,支持多个输入和输出流,包括从文件或 URL 读取和写入文件。

因此,如果您想按原样使用二进制搜索代码,则需要下载这些文件。

于 2013-04-25T06:02:44.650 回答
9

如果您已经设置了课程推荐的环境,只需将此行添加到您的 java 文件中

import edu.princeton.cs.algs4.StdIn;
import edu.princeton.cs.algs4.StdOut;
于 2015-09-05T01:43:19.310 回答
4

你可以用

输出:

 System.out.println(key);

输入

BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
String Key= null;
try {
     Key = reader.readLine();
} catch (IOException e) {
   e.printStackTrace();
} 

他们正在使用自定义库将值打印到控制台(大概)您可以将输出重定向到控制台。

于 2013-04-25T06:06:54.593 回答
4

StdIn 和 In 是包含在 algs4 类下载中的自定义库。使用命令 java-algs4 而不仅仅是 java 执行程序,它应该可以工作。

于 2014-02-02T22:02:05.023 回答
0

我正在尝试使用StdInStdOut包含stdlib.jar在我的项目中,并且它已正确放置在类路径中,但我无法通过添加使其工作:

  • 导入 edu.princeton.cs.algs4.StdIn;
  • 导入 edu.princeton.cs.algs4.StdOut;

在我自己的java文件中。

我在这里找到解决方案。我刚刚删除了我的 java 文件中的包信息,并且没有任何我可以使用的导入信息StdInStdOut因为我的所有 java 文件和StdIn,StdOut都在默认包中。

顺便说一句,在现实世界的生产就绪项目中这样做是一种不好的做法。

于 2020-11-26T04:13:10.533 回答
0

stdlib.jar最好放在文件夹中,src以便于查找路径。如果您使用任何 IDE,请添加库的类路径。

如果您遇到stdlib默认库的问题,请使用这些命令编译和运行代码。

编译

javac -cp .;<YOUR\PATH\OF\THE\LIB\stdlib.jar> yourProgram.java

java -cp .;<YOUR\PATH\OF\THE\LIB\stdlib.jar> yourProgram <arguments>

如果您遵循我的建议,那么路径将只是stdlib.jar或更有条理lib\stdlib.jar

参考链接:https ://introcs.cs.princeton.edu/java/stdlib/

于 2021-07-13T08:27:57.330 回答
-2

您应该使用System.inandSystem.out而不是StdInand StdOut。通过以下方式
创建一个包装系统输入流: 它有一个方法 amd 来检查它是否为空,你必须捕获.ObjectInputStream
ObjectInputStream ois = new ObjectInputStream(System.in);
readIntEOFException

于 2013-04-25T06:08:36.287 回答