通过命令行Java读取标准输入

4

我是 Sedgwick (普林斯顿大学) 的算法1课程的学生,我想从标准输入读取一个整数,该整数代表将要输入的整数对的数量,然后从标准输入读取一组整数对列表。

例如:

3                     //first integer represents number of pairs

12  34                  //list of integer pairs

23  56

34  78

I was hoping to type:

java  myProg   3  12   34  23  56   34  78  

在Windows命令行中的命令提示符下,首先读取前3个命令,然后在循环中依次处理每对命令。
视频中给出的代码如下:
package getArgs;

public class getInput {

public static void main(String[] args) {
    int N = StdIn.readInt();   //read first integer 
    while (!Stdin.isEmpty()){  // loop through pairs
        int p = StdIn.readInt();
        int q = StdIn.readInt();
        //process p and q      //process each pair

    }


}

问题:

  1. 在代码中,Stdin.readInt()是实际的Java还是伪代码?

  2. 如果它不是伪代码,我需要导入一个库来访问StdIn吗?

  3. 如果它是伪代码,我需要使用Scanner类来替换StdIn.readInt()吗?

程序的其余部分是正确的,即并查集类算法。这个驱动程序用于测试程序的说明不够清楚,让我有些困惑。

这是我的修改尝试 - 它很丑陋

public class getInput {



public static void main(String[] args) {

    int i = 0;  //counter;
    int N = 0;  


    N = Integer.parseInt(args[0]);  //Read first Integer 
    System.out.println(N );         //check it works
    i = i + 1;

    while ( i < N * 2 ){

        int p = Integer.parseInt(args[i]);  //get first of the next pair
        i=i + 1;
        int q = Integer.parseInt(args[i]);  //get second of the next pair
        System.out.println(p + "  " + q );  //check


    }


}

这个代码可以运行,但它比使用StdIn的代码更丑陋。有没有人能够重写它,使用StdIn使得Java能够识别它?


"如果这是伪代码,我可以使用Scanner类来替换StdIn.readInt()吗?" -- 是的,您可以创建一个包装System.in的Scanner并使用它来读取控制台输入。 - azurefrog
1
请注意,在 java myProg 10 12 34 23 56 34 78 命令中的 10 12 34 23 56 34 78java 程序的参数。第一个参数是类名,java 应该在其中搜索 main 方法,其余的参数则被移动到 String[] args 数组中。标准输入流连接到 java 进程,可以通过 System.in 引用。默认情况下,此流从控制台读取数据。 - Pshemo
你现在似乎在问多个无关的问题。接受有关StdIn来源的答案,然后提出一个新问题。 - Jonah Graham
6个回答

2

好的,我已经将其成功运作,并且 snickers 的评论是正确的。StdIn 类是由 Sedgewick 编写并在他早期的书籍中发表的。我只是创建了 StdIn 和 StdOut 类,并将代码从互联网复制到空类文件中,然后它就可以工作了。总结一下,这是教授创建的类,用于简化从命令行读取。


1

(通过@snickers10m的研究!)

代码中的Stdin.readInt()是实际的Java还是伪代码?

实际的Java代码。从文档中,Stdin.readInt执行以下操作:

从标准输入读取下一个标记,将其解析为整数,并返回该整数。

如果不是伪代码,我需要导入库才能访问StdIn吗?

这取决于你如何获得Stdin.javaStdin.class。如果它在相同的包中,则不需要import,只需在类路径中有Stdin.class即可。

(编辑:进行了更多搜索,找到http://introcs.cs.princeton.edu/java/15inout/

从文档中:

为了使用这些库,将StdIn.javaStdOut.javaStdDraw.javaStdAudio.java下载到与您的程序相同的目录中即可。

如果它是伪代码,我该使用Scanner类来替换StdIn.readInt()吗?

无法回答,因为这是实际代码。

让您的代码与StdIn配合使用

(根据问题进行编辑。)

您应该将程序移出包并移到与StdIn相同的包中。


1

让我们尝试通过调用以下代码 java getInput 10 12 34 23 56 34 78 看看会发生什么。

public class getInput {

    public static void main(String[] args) {
        for (int i = 0; i < args.length; i++) {
            System.out.println("arg " + i + ": " + arg);
        }
    }

}

这与Pshemo已经评论的内容有关。

0

请查看此链接这里,它显示Stdin实际上是Scanner的包装类。如果您有它,可以使用它,否则请使用Scanner。如果您没有它,请从该链接中获取并将其编译为应用程序的一部分。

但是,如果您将它们作为args[]发送,则不需要任何内容,在这种情况下,您可以将字符串值引用为args1, args[2]等。


0

Std(标准库)是为学生提供的,它不是“已安装的Java库”的一部分,因此您可以下载Std库并在路径中声明它,然后它就可以工作了。


0

代码中的Stdin.readInt()是实际的Java代码还是伪代码?

那是伪代码。Stdin不是JRE中的Java类。

如果它是伪代码,我该使用Scanner类来替换StdIn.readInt()吗?

最好使用System的InputStream。这是一个大致的示例:

BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
System.out.print("Enter String");
String s = br.readLine();
System.out.print("Enter Integer:");
try{
    int i = Integer.parseInt(br.readLine());
    // ...
} catch(NumberFormatException nfe){
    nfe.printStackTrace();
    System.exit(-1);
}

StdIn是一个类。它不是Java API的一部分,而是由计算机编程导师在他的大学制作的一个类。请看我的回答。 - snickers10m

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接