我一直在读这本书算法第4版。它的代码示例从命令行获取输入
String[] a = StdIn.readAllStrings();
并对它们进行排序。 StdIn.java的源代码在http://introcs.cs.princeton.edu/java/stdlib/StdIn.java中给出。堆排序的来源是http://algs4.cs.princeton.edu/24pq/Heap.java,但实际上并不相关。 主要功能如下:
public static void main(String[] args) {
String[] a = StdIn.readAllStrings();
Heap.sort(a);
show(a);
}
没有明确提及args。然而,当我在命令行中传入一个文本文件作为参数时,它的工作原理如下:
% more tiny.txt
S O R T E X A M P L E
% java Heap < tiny.txt
A E E L M O P R S T X
当没有给出引用时,有人可以告诉我程序如何在输入中读取。非常感谢先进!
编辑:更改了stdin java的链接。我的坏。
答案 0 :(得分:1)
在命令行中,将文件作为< whatever
传递给应用程序意味着whatever
文件的内容将成为应用程序的输入。这意味着tiny.txt
(在您的具体情况下)的内容将成为应用程序的用户输入。
答案 1 :(得分:1)
查看您提供的In
类的默认构造函数,我假设StdIn
只是一个默认初始化的实例。通过这个构造函数,它从stdin读取。通过将stdin重定向到文件(&lt;),您将文件的内容提供给此阅读器,这只是读取行。
要清楚,文本文件不会在args数组中提供给您的程序。那将是java Heap sort.txt
。而是将标准输入流重定向为来自文件。
答案 2 :(得分:1)
你错了:
“StdIn.java的源代码在http://introcs.cs.princeton.edu/java/stdlib/In.java中给出。”
实际上StdIn.java的源代码是http://introcs.cs.princeton.edu/java/stdlib/StdIn.java。你看错了班级!
“然而,当我在命令行中传入一个文本文件作为参数时,它就像宣传的那样工作”。
实际上,您不是将文本文件作为参数传递。真!
执行此操作时:
% java Heap < tiny.txt
shell正在打开文件,并将打开的文件描述符传递给Java。 Java将此文件描述符包装为java.io.InputStream
对象,并通过java.lang.System.in
变量使其可用于应用程序。这就是StdIn.readAllStrings()
实际上正在阅读的内容。
实际上,您的Heap
程序没有命令行参数。如果您在args.length
方法中打印main
,则会看到它为零。