入力形式
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);
}
}
}
すべての再帰呼び出しで新しい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);
}
}
}
変化する
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
は一度だけチェックします。
再帰を使用する必要がある場合は、ヘルパー関数を使用できます。
_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回だけ呼び出されていることに注意してください。
Scanner
はBufferedReader
の一種です(継承などについては言っていません。両方にバッファがあると言います。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 Scanner
sを作成して、同じ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()==true
がtrue
の場合に限り、そのステートメントはtrue
になるため、s.hasNextLine()
を使用する必要はありません。
Windowsシステムでは_Ctrl+Z
_を、Unixでは_Ctrl+D
_を使用して、EOF
文字をコンソールに与えることができます。私が知っているように、NetBeansの出力ウィンドウを使用してEOF
文字を送信することはできません。
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
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);
};
}
}
}
このようにして、望ましい結果を得ることができます。
パブリッククラス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();
}
}
これはエラーのないプログラムです。
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++;
}
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++;
}
}
public static void main(String[] args) {
Scanner scan = new Scanner(System.in);
int count = 1;
while(scan.hasNext()){
System.out.println(count++ + " " + scan.nextLine());
}
}