Comment utiliser le scanner hasNext () pour parcourir une ligne de texte du clavier et valider l'entrée utilisateur de l'entier et de la chaîne

Anika:

J'ai un problème à essayer de comprendre comment je peux parcourir une ligne de texte d'entrée au clavier que l'utilisateur donnera ex:

Anika 14 Dan 16

Je veux lire chaque jeton et attribuer à String name, Int, age, String name, int age. dans cet ordre. C'est facile cependant, si l'utilisateur entre Anika Anika Anika Anika 13 13 13 Dan 16

Ensuite, je veux que le programme:

Anika, 
Integer needed got String, 
Integer needed got String, 
Integer needed got String, 
13, 
String needed got Integer, 
String needed got Integer, 
Dan, 
16 

Ainsi, le premier sera toujours une chaîne qui est un mot EDIT: "mot", le second une chaîne int et une chaîne thrid qui est un "mot" et le quatrième int. Cependant, je ne peux pas simuler cela.

Scanner scan = new Scanner(System.in);
String name = null;
int age = 0;
String name2= null;
int age2= 0;
                if(scan.hasNext() == true)
        name = scan.next();
            age = scan.nextInt();
        name2= scan.next();
            age2= scan.nextInt();

Je sais que si je fais le haut, j'obtiens le bon ordre, mais ce sont les entrées supplémentaires que je voudrais ignorer, mais écrire une expression de déclaration pourquoi c'est faux, puis continuer à rechercher le prochain int, ou troisième chaîne et ainsi de suite.

 boolean isstring = false;
  boolean isnumber = false;
    do {
    if (scan.hasNext())
    {
        name = scan.next();
        isstring = true;
    }
    else {

        System.out.println("Need String got Integer");
        isstring = false;
        scan.next();

    }
    } while (!isstring);


    do {
    if (scan.hasNextInt())
    {
        age = scan.nextInt();
        isnumber=true;
    }
    else {

        System.out.println("Need Integer got String");
        isnumber=false;
        scan.nextInt();

    }
    } while (!isnumber);



    do {
    if (scan.hasNext())
    {
        name2 = scan.next();
        isstring = true;
    }
    else {

        System.out.println("Need String got Integer");
        isstring = false;
        scan.next();

    }
    } while (!isstring);


    do {
    if (scan.hasNextInt())
    {
        age2 = scan.nextInt();
        isnumber = true;
    }
    else {

        System.out.println("Need Integer got String");
        isnumber=false;
        scan.nextInt();

    }
    } while (!isnumber);


    }

J'ai essayé d'utiliser faire avec des ifs et cela n'a pas fonctionné. Ma logique est erronée quelque part, et je pense que ce pourrait être la méthode has.next ().

Toute aide serait appréciée!!

Cristóbal Ramos Merino:

Si l'entrée est un mot en attendant un Integer, elle lèvera InputMismatchException. nextInt()commencez par lire la valeur sous forme de chaîne puis analysez-la comme un entier, donc si vous ignorez la valeur à l'aide de nextInt, si la valeur est un mot, elle trowa l'exception susmentionnée.

En utilisant la même logique de votre programme

Les changements devraient être:

  1. Ignorer l'entrée avec scan.next()
  2. Vérifiez si une chaîne peut être ou non un entier (en utilisant scan.hasNextInt()), pas si est une chaîne, car tout entier peut être exprimé sous forme de chaîne.
  boolean isstring = false;
  boolean isnumber = false;

  do {
   if (!scan.hasNextInt()) {
    isstring = true;
    name = scan.next();
   } else {
    isstring = false;
    System.out.println("Need String got Integer");
    scan.next();
   }
  } while (!isstring);

  do {
   if (scan.hasNextInt()) {
    isnumber = true;
    age = scan.nextInt();
   } else {
    isnumber = false;
    System.out.println("Need Integer got String");
    scan.next();
   }
  } while (!isnumber);

  do {
   if (!scan.hasNextInt()) {
    isstring = true;
    name2 = scan.next();
   } else {
    isstring = false;
    System.out.println("Need String got Integer");
    scan.next();
   }
  } while (!isstring);

  do {
   if (scan.hasNextInt()) {
    isnumber = true;
    age2 = scan.nextInt();
   } else {
    isnumber = false;
    System.out.println("Need Integer got String");
    scan.next();
   }
  } while (!isnumber);

Utiliser try / catch et une boucle

Une solution naïve utilisant try / catch peut être la suivante

public static void main (String[]args)
  {
    String name = null;
    String name2 = null;
    Integer age = null;
    Integer age2 = null;
    Scanner scan = new Scanner(System.in);
    while (scan.hasNext())
      {
    try
    {
      if (name == null)
        {
          System.out.println("Please provide name: ");
          name = getNameOrFail(scan);
          System.out.println("Name set: " + name);
        }
      if (age == null)
        {
          System.out.println("Please provide age: ");
          age = getAgeOrFail(scan);
          System.out.println("Age set: " + age);
        }
      if (name2 == null)
        {
          System.out.println("Please provide name2: ");
          name2 = getNameOrFail(scan);
          System.out.println("Name2 set: " + name2);
        }
      if (age2 == null)
        {
          System.out.println ("Please provide age2: ");
          age2 = getAgeOrFail (scan);
          System.out.println ("Age2 set: " + age2);
        }
    }
    catch (Exception e)
    {
      System.out.println(e.getMessage ()); // Print the message put int Exception(message) constructor
      scan.nextLine(); // Flush the Scanner cache
    }
      }
  }

  public static String getNameOrFail(Scanner scan) throws Exception
  {
    if (scan.hasNextInt())
      throw new Exception("Need String got Integer");
    return scan.next();
  }

  public static Integer getAgeOrFail(Scanner scan) throws Exception
  {
    if (!scan.hasNextInt())
      throw new Exception("Need Integer got String");
    return scan.nextInt();
  }

Faites attention à la scan.newLine()clause in the catch, cela est nécessaire car le Scanner utilise un cache avec la dernière entrée, donc si elle n'est pas relue, vous entrez dans une condition de boucle infinie.

Bonne chance!

Cet article est collecté sur Internet, veuillez indiquer la source lors de la réimpression.

En cas d'infraction, veuillez [email protected] Supprimer.

modifier le
0

laisse moi dire quelques mots

0commentaires
connexionAprès avoir participé à la revue

Articles connexes

TOP liste

  1. 1

    comment afficher un bouton au-dessus d'un autre élément ?

  2. 2

    impossible d'obtenir l'image d'arrière-plan en plein écran dans reactjs

  3. 3

    Je continue à obtenir l'objet 'WSGIRequest' n'a pas d'attribut 'Get' sur django

  4. 4

    comment supprimer "compte de connexion google" à des fins de développement - actions sur google

  5. 5

    Conversion double en BigDecimal en Java

  6. 6

    Impossible d'accéder à la vue personnalisée pendant le test de l'interface utilisateur dans XCode

  7. 7

    Algorithme: diviser de manière optimale une chaîne en 3 sous-chaînes

  8. 8

    Passer la taille d'un tableau 2D à une fonction ?

  9. 9

    Comment obtenir l'intégration contextuelle d'une phrase dans une phrase à l'aide de BERT ?

  10. 10

    Comment changer le navigateur par défaut en Microsoft Edge pour Jupyter Notebook sous Windows 10 ?

  11. 11

    CSS: before ne fonctionne pas sur certains éléments,: after fonctionne très bien

  12. 12

    Comment créer un bot à compte à rebours dans Discord en utilisant Python

  13. 13

    Comment ajouter une entrée à une table de base de données pour une combinaison de deux tables

  14. 14

    Exporter la table de l'arborescence vers CSV avec mise en forme

  15. 15

    Comment activer le message Pylint "too-many-locals" dans VS Code?

  16. 16

    Créer un système Buzzer à l'aide de python

  17. 17

    Spring @RequestParam DateTime format comme ISO 8601 Date Heure facultative

  18. 18

    Empêcher l'allocation de mémoire dans la génération de combinaison récursive

  19. 19

    Déplacement des moindres carrés d'ajustement pour les déplacements de points ayant des problèmes

  20. 20

    Comment choisir le nombre de fragments et de répliques Elasticsearch

  21. 21

    Microsoft.WebApplication.targets

chaudétiquette

Archive