8

私はJAVA割り当てに取り組んでおり、複数行の入力を処理する必要があります。指示は「入力はstdinから読み取られます」と読みます。

サンプル入力の例を次に示します。

one 1
two 2
three 3

上記のサンプル入力「stdinから読み取る」の意味がわかりません。

これが私の混乱を分離する私が書いたテストプログラムです:

import java.io.*;
import java.util.Scanner;

class Test
{
public static void main(String[] args)
{   
    Scanner stdin = new Scanner(System.in);
    while(stdin.hasNextLine())
    {
        String line = stdin.nextLine();
        String[] tokens = line.split(" ");
        System.out.println(Integer.parseInt(tokens[1]));
    }
}

このプログラムをコンソールで実行すると、入力を待機し、行を入力するたびに、期待どおりにエコーバックします。したがって、上記のサンプル入力は、この方法で3行のそれぞれを入力することで実現できるのではないかと思いました。ただし、プロセスを終了する方法はないようです。3行入力した後、入力を終了するにはどうすればよいですか?Enterキーを2回押してみましたが、改行文字のみで構成される行として読み取られているようです。この行は、期待する2トークン形式に適合しないため、エラーが発生します。

コンソールの相互作用は次のようになります。

javac Test.java
java Test
one 1
1
two 2
2
three 3
3

Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 1
    at Test.main(Test.java:13)

私の理解のギャップを指摘するのに助けていただければ幸いです。

4

4 に答える 4

4

あなたは空の入力を求めることを試みることができます

import java.util.Scanner;

public class Test
{
    public static void main(String[] args)
    {   
        String line;
        Scanner stdin = new Scanner(System.in);
        while(stdin.hasNextLine() && !( line = stdin.nextLine() ).equals( "" ))
        {
            String[] tokens = line.split(" ");
            System.out.println(Integer.parseInt(tokens[1]));
        }
        stdin.close();
    }
}
  • コードはほぼ完成しています。あなたがしなければならないのは、whileループを終了することだけです。このコードサンプルでは、​​最初に読み取り入力値をlineに設定し、次に返された文字列が空かどうかをチェックする条件を追加しました。その場合、whileループの2番目の条件はfalseを返し、停止させます。
  • 配列インデックスの範囲外の例外は、空白で指定された2つ以上の値を入力していない場合にのみ発生します。静的インデックスによって2番目の値>token[1] <を取得しようとしない場合は、このエラーを回避できます。
  • リーダーを使用している場合は、使用後に閉じることを忘れないでください。
  • 最後になりましたが、コンソールでプロセスを終了するために通常のCtrl + Cホットキーを試しましたか?

幸運を!

于 2013-01-19T05:30:21.407 に答える
2

input.txt などのファイルに値を入れて、次のようにすることもできます。

java Test < input.txt
于 2015-06-30T22:13:18.590 に答える
1

シェルからCtrl-Dを押すと、stdinが閉じます。または、パイプ入力

cat your-input-file | java Test
于 2013-01-19T04:45:39.743 に答える
1

入力を停止するには、ユーザーにquitと入力して終了するように促し、入力にその文字列が存在するかどうかをテストして、見つかったときにループを終了するか、ループ内のカウンターを使用して、次のときにループを終了します。最大反復回数に達しました。ステートメントはbreak、ループから抜け出します。

于 2013-01-19T04:45:53.700 に答える