Format d'entrée
Lire des n lignes inconnues à partir de stdin(System.in)
jusqu'à atteindre EOF; chaque ligne d'entrée contient une chaîne non vide.
Format de sortie
Pour chaque ligne, imprimez le numéro de ligne suivi d'un espace, puis le contenu de la ligne reçu en entrée:
Exemple de sortie
Hello world
I am a file
Read me until end-of-file.
Voici ma solution. Le problème étant que je ne peux pas continuer avant EOF. Mais le résultat est juste:
Hello world
Voici mon code:
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);
}
}
}
Votre code ne fonctionne pas car vous créez un nouvel objet Scanner
dans chaque appel récursif. Vous ne devez pas utiliser la récursivité de cette façon, faites-le plutôt de manière itérative.
Version itérative
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++;
}
}
}
Version récursive
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);
}
}
}
Changement
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);
}
Les boucles while
continuent jusqu'à ce que les données existent, où if
vérifie une seule fois.
Si l'utilisation de la récursivité est une exigence, vous pouvez utiliser une fonction d'assistance:
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);
}
Remarquez comment new Scanner(System.in)
n'est appelé qu'une fois.
Scanner
est une sorte de BufferedReader
(je ne parle pas d'héritage ou de quelque chose. Je dis qu'ils ont tous les deux des tampons. Scanner
n'en a qu'un petit). Ainsi, une fois que vous avez saisi du texte dans la console, il s'agit de read()
from System.in
et stockés dans la mémoire tampon à l'intérieur de 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());
}
}
Utilisez l'entrée suivante pour la Scanner
:
ligne 1
ligne 2
ligne 3
ligne 4
Vous obtiendrez le résultat:
Lire la ligne :: e 1
Lire ligne :: ligne 2
Lire ligne :: ligne 3
Lire ligne :: ligne 4
Je pense que vous connaissez peut-être la raison de cette sortie. Certains caractères de la première ligne sont dans le Scanner s1
. Par conséquent, ne pas créez 2 Scanner
s pour prendre les entrées de même Stream
.
Vous pouvez modifier votre code comme suit pour obtenir la sortie requise.
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);
}
}
Vous pouvez utiliser s.hasNextLine()
au lieu de s.hasNext()
lorsque vous lisez ligne par ligne.
Il n'est pas nécessaire d'utiliser s.hasNextLine()==true
car cette instruction sera true
si et seulement si s.hasNextLine()
est true
.
Vous pouvez attribuer un caractère EOF
à la console à l'aide de Ctrl+Z
sous Windows et de Ctrl+D
sous Unix. Comme je le sais, vous ne pouvez pas envoyer de caractère EOF
à l’aide de la fenêtre de sortie de NetBeans.
Utilisez While tant que si, mais la version récursive est préférable. Voici la version itérative:
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);
};
}
}
}
Voici le programme sans erreur.
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());
}
}