Continuez à lire les nombres jusqu'à ce que le saut de ligne ont atteint à l'aide d'un Scanner
Je veux lire un couple de nombres à partir de la console. La façon dont je veux faire c'est en ayant à l'utilisateur d'entrer une séquence de nombres séparés par un espace. Code pour effectuer les opérations suivantes:
Scanner sc = new Scanner(System.in);
while (sc.hasNextInt()){
int i = sc.nextInt();
//... do stuff with i ...
}
Le problème est, comment puis-je arrêter en arrivant sur une nouvelle ligne (tout en gardant le facile-à-lire le code ci-dessus)? L'ajout d'un !hasNextLine() à l'argument ci-dessus fait quitter la boucle instantanément. Une solution pourrait être la lecture de l'ensemble de la ligne et d'analyser les chiffres, mais je pense un peu ruines de la fin de la hasNextInt() la méthode.
donc si il y a des nombres sur une ligne différente vous n'avez pas envie de les lire?
Exactement, car il n'y a pas d'autre moyen pour arrêter la lecture de l'entrée (autant que je sache) que d'avoir le type d'utilisateur autre chose qu'un nombre, ce qui me semble de moins en moins convivial (edit: ce Qui signifie, je pense, entrez serait la façon la plus intuitive pour arrêter la lecture de la séquence).
Exactement, car il n'y a pas d'autre moyen pour arrêter la lecture de l'entrée (autant que je sache) que d'avoir le type d'utilisateur autre chose qu'un nombre, ce qui me semble de moins en moins convivial (edit: ce Qui signifie, je pense, entrez serait la façon la plus intuitive pour arrêter la lecture de la séquence).
OriginalL'auteur Snail | 2011-02-21
Vous devez vous connecter pour publier un commentaire.
Vous souhaitez définir le séparateur comme ceci:
Mise à JOUR:
Le code ci-dessus fonctionne bien que si l'utilisateur tape un nombre et de la frappe, puis entrée. Lorsque vous appuyez sur entrer sans avoir entré un numéro du programme, la boucle va se terminer.
Si vous avez besoin d' (compris qu'il est plus que une suggestion pour l'ergonomie) pour entrer les nombres séparés par un espace, regarder le code suivant:
Il utilise un
Pattern
pour les délimiteurs. Je l'ai mis à correspondre à un espace blanc ou un séparateur de ligne. Ainsi, l'utilisateur peut entrer des nombres séparés par un espace, puis taper entrée pour obtenir scannées. Cette opération peut être répétée autant de lignes que nécessaire. Lorsque terminé, l'utilisateur frappe juste d'entrer à nouveau sans la saisie d'un nombre. Pense que c'est assez pratique, lors de la saisie du nombre de numéros.useDelimiter(x)
dit quex
est le jeton valide délimiteur. Par conséquent, si vous essayez d'entrer par exemple "42 314", Java va voir que l'ensemble de la ligne comme un jeton, qui n'est pas valide (unique) int. Par conséquent, il n'y a pas de "prochaine int", et la boucle se termine.Vous avez raison. Il ne fonctionne pas avec "42 314" comme je l'avais un peu différente de guidage de l'utilisateur à l'esprit. J'ai l'habitude de saisir un numéro avec le pavé numérique, ce qui rend le retour d'un très pratique séparateur. Mise à jour de la réponse avec un Motif comme délimiteur. Pense que c'est plutôt un bon match quand on ne veux le garder propre avec scanner.
Semble raisonnable. Downvote supprimé.
Nice, c'est ce que je cherchais! Vous pouvez également ajouter un espace à la fin d'un certain nombre de terminer la boucle. (Tu je voudrais une seule entrée appuyez pour mettre fin 😉
OriginalL'auteur Chris
Vous pouvez utiliser sc.nextLine() pour lire une ligne d'entrée, puis la construction d'un nouveau Scanner de cette Chaîne (il y a une surcharge du constructeur qui prend une Chaîne de caractères) et de lire les entiers à partir de la deuxième Scanner. (Remarque: Si c'est ce que vous entendez par "la lecture de l'ensemble de la ligne et d'analyser les chiffres", je vais supprimer cette réponse, mais il semblait que tu parlais d'une lecture manuelle des numéros de avec Entier.parseInt()).
BufferedReader
C'est à peu près ce que je voulais dire avec cette phrase, mais encore plus propre solution que celle que j'avais dans ma tête 😉 Donc s'il vous plaît, garder!
pourquoi? Personnellement, je trouve Scanner à être beaucoup plus efficace que BufferedReader pour ce genre de choses.
Êtes-vous ce qui implique que la performance de
Scanner
obtenir une ligne est significativement moins efficace queBufferedReader
?J'ai aussi été dans ACMs (et non acm compétitions sanctionnées) et n'ai pas trouvé ou entendu que ce soit le cas. Ni dans ma carrière en tant que développeur java ai-je entendu dire que ce soit le cas. Quand je regarde la source de les deux, je trouve que
BufferedReader.readLine()
est synchronisé, alors queScanner.nextLine()
n'est pas, ce qui me fait penser que le Scanner est actaully PLUS efficace pour cela.OriginalL'auteur Aasmund Eldhuset