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

Reading standard input via command line java

我正在学习Sedgwick(普林斯顿大学)的Algorithms 1课程,并尝试从标准输入中读取一个整数,该整数表示将要输入的整数对的数量,然后是来自标准输入的整数对的列表。

例如:

1
2
3
4
5
6
7
3                     //first integer represents number of pairs

12  34                  //list of integer pairs

23  56

34  78

我希望输入:

1
java  myProg   3  12   34  23  56   34  78

在Windows命令行的命令提示符处,先读取3,然后循环并依次处理每对。

视频中给出的代码是这样的:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
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

    }


}

题:

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

  • 如果不是伪代码,是否需要导入库以访问StdIn?

  • 如果它是伪代码,是否可以使用Scanner类替换StdIn.readInt()?

  • 该程序的其余部分都可以正常工作,也就是联合查找类算法,该驱动程序无法很好地解释该程序,使我感到困惑。

    这是我修改过的尝试-很难看

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    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识别StdIn吗?


    好的,我可以使用它,士力架的评论是正确的。 StdIn类由Sedgewick编写,并在他的早期著作中发表。我只创建了StdIn和StdOut类,然后将代码从互联网复制到空的类文件中,然后就可以了。总而言之,这是由教授创建的类,用于简化从命令行的阅读。


    (通过@ snickers10m做的研究!)

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

    实际的Java代码。从文档Stdin.readInt执行此操作:

    Reads the next token from standard input, parses it as an integer, and
    returns the integer.

    如果不是伪代码,是否需要导入库以访问StdIn?

    取决于Stdin.javaStdin.class如何交付给您。如果它与您不需要的包在同一包中,并且为import,则您的类路径上应该只有Stdin.class

    (编辑:谷歌搜索更多,找到http://introcs.cs.princeton.edu/java/15inout/)

    从文档:

    To use these libraries, download StdIn.java, StdOut.java,
    StdDraw.java, and StdAudio.java into the same directory as your
    program.

    如果它是伪代码,是否可以使用Scanner类替换StdIn.readInt()?

    不适用,因为它是实际代码

    使您的代码与StdIn一起使用

    (在对问题进行编辑之后。)

    您应该将程序从软件包中移出,与StdIn移到同一软件包中


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

    1
    2
    3
    4
    5
    6
    7
    8
    9
    public class getInput {

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

    }

    这与Pshemo已经发表的评论有关。


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


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

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

    如果它是伪代码,是否可以使用Scanner类替换StdIn.readInt()?

    使用System的InputStream会更好。这是一个简单的实现示例:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    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实际上是Scanner的包装器类。如果有它,则可以使用它,否则,请使用Scanner。如果没有它,只需从该链接中获取它,并将其编译为应用程序的一部分。

    但是,如果以args []的形式发送它们,则不需要任何内容??,在其中可以将字符串值引用为args1,args [2] ...等。