web-dev-qa-db-ja.com

ScannerクラスのhasNext()の使い方

入力形式

EOFに達するまで、stdin(System.in)から未知のn行の入力を読み取ります。入力の各行に空でない文字列が含まれています。

出力形式

各行について、行番号を出力し、その後に1つのスペースを入力してから、入力として受け取った行の内容を出力します。

サンプル出力

Hello world
I am a file
Read me until end-of-file.  

これが私の解決策です。問題は、EOFまで続行できないことです。しかし、出力は次のとおりです。

Hello world

これが私のコードです:

public class Solution {

    public static void main(String[] args) {
        check(1);  // call check method
    }

    static void check(int count) {          
        Scanner s = new Scanner(System.in);
        if(s.hasNext() == true) {
            String ns = s.nextLine();
            System.out.println(count + " " + ns);
            count++;
            check(count);
        }
    } 
}
5
Harshit Juneja

すべての再帰呼び出しで新しいScannerオブジェクトを作成するため、コードは機能しません。とにかく、これには再帰を使用しないでください。代わりに繰り返し実行してください。

反復バージョン

public class Solution {

    public static void main(String[] args) {

        Scanner s = new Scanner(System.in);
        int count = 1;

        while(s.hasNext()) {
            String ns = s.nextLine();
            System.out.println(count + " " + ns);
            count++;
        }
    }
}

再帰バージョン

public class Solution {

    private Scanner s;

    public static void main(String[] args) {

        s = new Scanner(System.in); // initialize only once
        check(1);
    }

    public static void check(int count) {
        if(s.hasNext()) {
            String ns = s.nextLine();
            System.out.println(count + " " + ns);
            check(count + 1);
        }
    }   
}
6
Willi Mentzel

変化する

if (s.hasNext() == true) {
    String ns = s.nextLine();
    System.out.println(count + " " + ns);
    count++;
    System.out.print(count);
    check(count);
}

に:

while (s.hasNext()) {
    String ns = s.nextLine();
    System.out.println(count + " " + ns);
    count++;
    System.out.print(count);
    check(count);
}

whileループはデータが存在するまで続きますが、ifは一度だけチェックします。

2
Suresh Atta

再帰を使用する必要がある場合は、ヘルパー関数を使用できます。

_static void check(int count) {          
    Scanner s = new Scanner(System.in);
    check(count, s);
} 

static void check(int count, Scanner scanner) {
    if(!scanner.hasNext()) {
        return;
    }
    String ns = scanner.nextLine();
    System.out.println(count + " " + ns);
    check(++count, scanner);
}
_

new Scanner(System.in)が1回だけ呼び出されていることに注意してください。

1
Ian2thedv

ScannerBufferedReaderの一種です(継承などについては言っていません。両方にバッファがあると言います。Scannerには小さなバッファしかありません)。したがって、コンソールにテキストを入力すると、それらは_System.in_からのread()であり、Scanner内のバッファーに格納されます。

_public static void main(String[] args) {          
    Scanner s1 = new Scanner(System.in);
    s1.hasNext();
    Scanner s2 = new Scanner(System.in);
    while(true){
        System.out.println("Read line:: " + s2.nextLine());
    }
}
_

Scannerへの次の入力を使用します。

ライン1
2行目
行3
行4

次のような出力が得られます。

読み取り行:: e 1
行を読み取ります::行2
行を読み取る::行3
行を読みます::行4

この出力の理由を知っていると思います。最初の行の一部の文字は_Scanner s1_にあります。したがってしないでください 2 Scannersを作成して、同じStreamから入力を取得します。

次のようにコードを変更して、必要な出力を取得できます。

_private static Scanner s;

public static void main(String[] args) {
    s = new Scanner(System.in);
    check(1);  // call check method
}

static void check(int count) {
    if (s.hasNextLine()) {
        String ns = s.nextLine();
        System.out.println(count + " " + ns);
        count++;
        check(count);
    }
}
_

行ごとに読み取るので、s.hasNextLine()の代わりにs.hasNext()を使用できます。

s.hasNextLine()==truetrueの場合に限り、そのステートメントはtrueになるため、s.hasNextLine()を使用する必要はありません。

Windowsシステムでは_Ctrl+Z_を、Unixでは_Ctrl+D_を使用して、EOF文字をコンソールに与えることができます。私が知っているように、NetBeansの出力ウィンドウを使用してEOF文字を送信することはできません。

1
Ramesh-X

Java.util.Scanner.hasNext()は基本的に、入力を読み取るのに役立ちます。このスキャナーの入力に任意のタイプの別のトークンがある場合、このメソッドはtrueを返します。それ以外の場合はfalseを返します。以下のコードスニペットを確認してください。

 while(sc.hasNext()) {
      System.out.println(i + " " + sc.nextLine());
      i++;
 }

以下のリンクで完全なコードを見つけることができます。

https://github.com/hetalrachh/HackerRank/blob/master/Practice/Java/Introduction/EndOfFile.Java

0
Hetal Rachh

Ifではなくwhileを使用しますが、再帰バージョンの方が優れています。反復バージョンは次のとおりです。

import Java.io.*;
import Java.util.*;

public class Solution {

    public static void main(String[] args) {
        /* Enter your code here. Read input from STDIN. Print output to STDOUT. Your class should be named Solution. */
        Scanner sc=new Scanner(System.in);
        {
            int i=0;

          while(sc.hasNext()==true)
            {
                i=i+1;
                 String s=sc.nextLine();
                System.out.println(i+" "+s);

            };
        }
    }
}
0
divya

このようにして、望ましい結果を得ることができます。

パブリッククラスEOF {

public static void main(String[] args) {
    Scanner scan = new Scanner(System.in);
    for(int i =1;scan.hasNext();i++) {
        String line = scan.nextLine();
        System.out.println(i + " " + line);
    }
    scan.close();
}

}

0
Chandru

これはエラーのないプログラムです。

import Java.util.Scanner;

public class Solution {

    public static void main(String[] args) {
        Scanner scan = new Scanner(System.in);
        int count = 1;
        while(scan.hasNext()) {
            String s = scan.nextLine();
            System.out.println(count + " " + s);
            count++;
        }
    }
}
Scanner scanner = new Scanner(System.in);
int i = 1;
while(scanner.hasNext()) {
  System.out.println(i + " " + scanner.nextLine());
  i++;
}
0
worked
public static void main(String[] args) {

    List<String> eol = new ArrayList<String>();
    Scanner in=new Scanner(System.in);
    int t=1;
    while(in.hasNext()){

        eol.add(in.nextLine());
    }

    for (String i:eol){

        System.out.println(t+" "+i);
        t++;
    }

}
0
user3480296
public static void main(String[] args) {
    Scanner scan = new Scanner(System.in);
    int count = 1;
    while(scan.hasNext()){
        System.out.println(count++ + " " + scan.nextLine());            
    }
}
0
myer