web-dev-qa-db-ja.com

Scannerを使用してstdinからの複数行の読み取りを停止するにはどうすればよいですか?

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)

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

8
dmoench

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

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ホットキーを試しましたか?

幸運を!

4
marwils

値をファイルに入れることもできます。 input.txtと実行:

Java Test < input.txt
2
denmojo

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

cat your-input-file | Java Test
1
Mike Samuel

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