web-dev-qa-db-fra.com

Comment utiliser hasNext () depuis la classe Scanner?

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);
        }
    } 
}
5
Harshit Juneja

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);
        }
    }   
}
6
Willi Mentzel

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.

2
Suresh Atta

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.

1
Ian2thedv

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 Scanners 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.

1
Ramesh-X

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);

            };
        }
    }
}
0
divya

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++;
}
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