Java Scanner nextline Définir un nombre de case
Résolu/Fermé
Pulsar360
Messages postés
113
Date d'inscription
lundi 12 novembre 2012
Statut
Membre
Dernière intervention
29 août 2018
-
Modifié par Pulsar360 le 12/11/2012 à 00:30
Pulsar360 Messages postés 113 Date d'inscription lundi 12 novembre 2012 Statut Membre Dernière intervention 29 août 2018 - 12 nov. 2012 à 19:19
Pulsar360 Messages postés 113 Date d'inscription lundi 12 novembre 2012 Statut Membre Dernière intervention 29 août 2018 - 12 nov. 2012 à 19:19
A voir également:
- Java Scanner nextline Définir un nombre de case
- Waptrick java football - Télécharger - Jeux vidéo
- Jeux java itel football - Télécharger - Jeux vidéo
- Scanner qr code pc - Guide
- Java apk - Télécharger - Langages
- Eclipse java - Télécharger - Langages
4 réponses
KX
Messages postés
16760
Date d'inscription
samedi 31 mai 2008
Statut
Modérateur
Dernière intervention
12 février 2025
3 020
12 nov. 2012 à 08:24
12 nov. 2012 à 08:24
1) "dans la console je ne puisse tapez QUE 18 caractères"
Tu ne peux pas obliger la console à s'arrêter après 18 caractères, car la console ne lit pas ta chaîne caractère par caractères, elle te propose d'éditer ta saisie, tu peux donc ajouter des caractères au début, à la fin ou au milieu de ce que tu as déjà entré, effacer des caractères, etc. La chaîne de caractères ne sera donc validé qu'une fois la touche entrée appuyée, avant elle n'existe pas, il est donc impossible d'effectuer des contrôles dessus tel que lui imposer une taille de 18 caractères.
Remarque : ce genre de choses se fait par contre très bien avec des composants visuels Swing où chaque évènement peut-être contrôle (voir : JTextField et KeyListener)
2) Est'il possible de traité un nombre plus grand qu'avec la méthode ""Long""?
Tu peux utiliser les BigInteger qui n'ont aucune limite de taille.
Remarque : dans le code qui suit, je modifies le délimiteur du Scanner pour autoriser la lecture de plusieurs entiers sur la même ligne (ça peut toujours servir).
Exemple, avec la lecture de la chaîne de caractères suivante :
Tu ne peux pas obliger la console à s'arrêter après 18 caractères, car la console ne lit pas ta chaîne caractère par caractères, elle te propose d'éditer ta saisie, tu peux donc ajouter des caractères au début, à la fin ou au milieu de ce que tu as déjà entré, effacer des caractères, etc. La chaîne de caractères ne sera donc validé qu'une fois la touche entrée appuyée, avant elle n'existe pas, il est donc impossible d'effectuer des contrôles dessus tel que lui imposer une taille de 18 caractères.
Remarque : ce genre de choses se fait par contre très bien avec des composants visuels Swing où chaque évènement peut-être contrôle (voir : JTextField et KeyListener)
2) Est'il possible de traité un nombre plus grand qu'avec la méthode ""Long""?
Tu peux utiliser les BigInteger qui n'ont aucune limite de taille.
Remarque : dans le code qui suit, je modifies le délimiteur du Scanner pour autoriser la lecture de plusieurs entiers sur la même ligne (ça peut toujours servir).
Scanner sc = new Scanner(System.in).useDelimiter("[^0-9\\+\\-]+"); while (sc.hasNextBigDecimal()) System.out.println(sc.nextBigInteger());
Exemple, avec la lecture de la chaîne de caractères suivante :
123 456 abcd -78 ef +90.12On obtient alors l'affichage des entiers BigInteger suivants :
123 456 -78 90 12
Pulsar360
Messages postés
113
Date d'inscription
lundi 12 novembre 2012
Statut
Membre
Dernière intervention
29 août 2018
10
Modifié par Pulsar360 le 12/11/2012 à 12:30
Modifié par Pulsar360 le 12/11/2012 à 12:30
Bonjour,
Merci pour ton aide, vraiment!!
Du coup j'ai choisis d'utiliser un String pour ma chaîne de caractère et je vais utiliser une méthode pour traité seulement les chiffres, même je ne sais pas encore la quel ni comment pour le moment lol.
Voici mon code:
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner sc1 = new Scanner(System.in), start = new Scanner(System.in);
System.out.println("Titre");
String Tab1[] = {"3479","97545","8543","217245","96644","567982"};
char restart = 'O';
while (restart == 'O' || restart == 'o') {
System.out.println("Tapez votre chaine de caractere :");
String chiffre = sc1.nextLine();
char i = chiffre.charAt(2);
/* --------------------------------------------------------------------------------
Et ici je souhaite afficher dans un "Systeme.out.println();" une valeur string du tableau Tab1 en récupérant la 3ieme valeur de la chaîne de caractère sc1 que je tape dans la console.
Exemple:
Si je tape 7653628 en position numéro 3 se trouve le chiffre 5 et donc je souhaite récupérer le String en position 5 de mon tableau donc sa m'afficherais 567982, si je tape 7636731 je souhaite récupérer le String en position 3 de mon tableau donc sa m'afficherais 8543, je pensais mettre Tab1[i] mais ce ne fonctionne pas j'ai une erreur au moment ou j'entre ma chaîne de caractère.
System.out.println(Tab1[i]);
-------------------------------------------------------------------------------- */
System.out.println("Voici ce que vous avez tapée : " + chiffre);
System.out.println("Voulez vous recommencer ?");
restart = start.nextLine().charAt(0);
}
System.out.println("*** Au revoir. ***");
}
}
Merci pour ton aide, vraiment!!
Du coup j'ai choisis d'utiliser un String pour ma chaîne de caractère et je vais utiliser une méthode pour traité seulement les chiffres, même je ne sais pas encore la quel ni comment pour le moment lol.
Voici mon code:
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner sc1 = new Scanner(System.in), start = new Scanner(System.in);
System.out.println("Titre");
String Tab1[] = {"3479","97545","8543","217245","96644","567982"};
char restart = 'O';
while (restart == 'O' || restart == 'o') {
System.out.println("Tapez votre chaine de caractere :");
String chiffre = sc1.nextLine();
char i = chiffre.charAt(2);
/* --------------------------------------------------------------------------------
Et ici je souhaite afficher dans un "Systeme.out.println();" une valeur string du tableau Tab1 en récupérant la 3ieme valeur de la chaîne de caractère sc1 que je tape dans la console.
Exemple:
Si je tape 7653628 en position numéro 3 se trouve le chiffre 5 et donc je souhaite récupérer le String en position 5 de mon tableau donc sa m'afficherais 567982, si je tape 7636731 je souhaite récupérer le String en position 3 de mon tableau donc sa m'afficherais 8543, je pensais mettre Tab1[i] mais ce ne fonctionne pas j'ai une erreur au moment ou j'entre ma chaîne de caractère.
System.out.println(Tab1[i]);
-------------------------------------------------------------------------------- */
System.out.println("Voici ce que vous avez tapée : " + chiffre);
System.out.println("Voulez vous recommencer ?");
restart = start.nextLine().charAt(0);
}
System.out.println("*** Au revoir. ***");
}
}
KX
Messages postés
16760
Date d'inscription
samedi 31 mai 2008
Statut
Modérateur
Dernière intervention
12 février 2025
3 020
12 nov. 2012 à 14:15
12 nov. 2012 à 14:15
Scanner sc1 = new Scanner(System.in), start = new Scanner(System.in);Ton clavier est unique, donc System.in est unique, donc ça ne sert à rien d'avoir deux Scanner !
"j'ai choisis d'utiliser un String pour ma chaîne de caractère"
Je ne vois pas l'intérêt, déjà en terme d'espace mémoire car un String va encoder chaque chiffre dans 1 caractère (soit 2 octets par chiffre) alors que les BigInteger vont encodés les valeurs au bit à bit (soit environ 0.4 octet par chiffre), sans oublier que vu les valeurs de ton tableau des int suffisent.
"une valeur string du tableau Tab1 en récupérant la 3ieme valeur de la chaîne de caractère"
Ça c'est assez simple, mais il faudrait au minimum que tu ais 10 valeurs dans ton tableau (une pour chaque chiffre)
String chiffre = sc1.nextLine(); // sc1.nextBigInteger().toString() ? char c = chiffre.charAt(2); int i = (int) (c-'0'); System.out.println(Tab1[i]);
Pulsar360
Messages postés
113
Date d'inscription
lundi 12 novembre 2012
Statut
Membre
Dernière intervention
29 août 2018
10
12 nov. 2012 à 14:40
12 nov. 2012 à 14:40
Merciiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiii, vraiment tu m'a bien aider !!!!
Je viens de testé est c'est bon, ça fonctionne sans problème.
J'étais vraiment tous près car c'est la ligne " int i = (int) (c-'0'); " qui me posait problème car au départ je voulais intégré directement cette méthode dans la méthode System.out.println(....."ICI".........) et je n'est réalisé que après qu'il fallait créer une méthode à part pour donné une valeur à une variable qui sera affiché dans le System.out.print.
Et du coup tu m'a bien aidé en me donnant cette méthode car j'ai essayé plein de méthode différente.
Par contre je garde la méthode String pour le sc1 au final car il risque d'y avoir des lettres aussi dedans.
Par contre je n'est pas comprit le "Ton clavier est unique, donc System.in est unique, donc ça ne sert à rien d'avoir deux Scanner !" car j'ai besoin de deux entré clavier. Un pour mon String pour le tableau Tab1 donc sc1 et un autre pour le retour while donc start.
Je viens de testé est c'est bon, ça fonctionne sans problème.
J'étais vraiment tous près car c'est la ligne " int i = (int) (c-'0'); " qui me posait problème car au départ je voulais intégré directement cette méthode dans la méthode System.out.println(....."ICI".........) et je n'est réalisé que après qu'il fallait créer une méthode à part pour donné une valeur à une variable qui sera affiché dans le System.out.print.
Et du coup tu m'a bien aidé en me donnant cette méthode car j'ai essayé plein de méthode différente.
Par contre je garde la méthode String pour le sc1 au final car il risque d'y avoir des lettres aussi dedans.
Par contre je n'est pas comprit le "Ton clavier est unique, donc System.in est unique, donc ça ne sert à rien d'avoir deux Scanner !" car j'ai besoin de deux entré clavier. Un pour mon String pour le tableau Tab1 donc sc1 et un autre pour le retour while donc start.
KX
Messages postés
16760
Date d'inscription
samedi 31 mai 2008
Statut
Modérateur
Dernière intervention
12 février 2025
3 020
12 nov. 2012 à 14:48
12 nov. 2012 à 14:48
"j'ai besoin de deux entré clavier."
Oui, mais tu n'as qu'un seul clavier !
sc1.nextLine(); ou start.nextLine() c'est pareil, la ligne récupérée sera de toute façon celle lue sur System.in (qui est unique), cela donnera le même résultat ! Alors pourquoi utiliser deux Scanner ?
Oui, mais tu n'as qu'un seul clavier !
sc1.nextLine(); ou start.nextLine() c'est pareil, la ligne récupérée sera de toute façon celle lue sur System.in (qui est unique), cela donnera le même résultat ! Alors pourquoi utiliser deux Scanner ?
Pulsar360
Messages postés
113
Date d'inscription
lundi 12 novembre 2012
Statut
Membre
Dernière intervention
29 août 2018
10
12 nov. 2012 à 15:01
12 nov. 2012 à 15:01
Et ben non car je vais tapez ma première série de caractère pour sc1 donc chaque caractère va devoir être traité différemment, et après je vais devoir refaire une saisie clavier et tappez O ou o pour recommencer un cycle.
Je doit inter-agir 2 fois via le clavier donc 2 entré clavier.
Je doit inter-agir 2 fois via le clavier donc 2 entré clavier.
KX
Messages postés
16760
Date d'inscription
samedi 31 mai 2008
Statut
Modérateur
Dernière intervention
12 février 2025
3 020
12 nov. 2012 à 15:40
12 nov. 2012 à 15:40
"Je doit inter-agir 2 fois via le clavier donc 2 entré clavier."
Alors tu n'as pas compris à quoi servait la classe Scanner ! Le Scanner n'est pas lié aux entrées claviers, mais au flux du clavier ! Tu as 1 clavier, donc 1 Scanner.
De plus tu n'as pas 2 entrées claviers, car avec ta boucle while tu peux en faire autant que tu veux !
À chaque tour de boucle tu utilises toujours le même Scanner pour taper tes 'O', et toujours le même Scanner pour taper les chiffres. Et pourtant il n'y a aucune différence entre les deux utilisations, ce que tu fais c'est toujours nextLine, c'est à dire que tu lis les données de System.in (le même System.in pour les deux Scanner !). Alors je ne vois pas ce qu'il y a de si troublant à utiliser plusieurs fois le même Scanner pour taper tantôt des 'O' et tantôt des chiffres, du point de vue de System.in ce sera de toute façon une succession de nextLine.
Si j'insiste sur ce point, c'est parce qu'un jour tu vas utiliser le Scanner pour manipuler des fichiers, et que si tu utilises plusieurs Scanner pour le même fichier ça va planter (1 fichier = 1 Scanner).
Alors tu n'as pas compris à quoi servait la classe Scanner ! Le Scanner n'est pas lié aux entrées claviers, mais au flux du clavier ! Tu as 1 clavier, donc 1 Scanner.
De plus tu n'as pas 2 entrées claviers, car avec ta boucle while tu peux en faire autant que tu veux !
À chaque tour de boucle tu utilises toujours le même Scanner pour taper tes 'O', et toujours le même Scanner pour taper les chiffres. Et pourtant il n'y a aucune différence entre les deux utilisations, ce que tu fais c'est toujours nextLine, c'est à dire que tu lis les données de System.in (le même System.in pour les deux Scanner !). Alors je ne vois pas ce qu'il y a de si troublant à utiliser plusieurs fois le même Scanner pour taper tantôt des 'O' et tantôt des chiffres, du point de vue de System.in ce sera de toute façon une succession de nextLine.
Si j'insiste sur ce point, c'est parce qu'un jour tu vas utiliser le Scanner pour manipuler des fichiers, et que si tu utilises plusieurs Scanner pour le même fichier ça va planter (1 fichier = 1 Scanner).
Pulsar360
Messages postés
113
Date d'inscription
lundi 12 novembre 2012
Statut
Membre
Dernière intervention
29 août 2018
10
12 nov. 2012 à 17:08
12 nov. 2012 à 17:08
Aaaaaaah oui je vois, c'est bon ça à fonctionner. Du coup j'ai retirer le Scanner "start" et j'ai utilisé restart = code.nextLine().charAt(0); pour tapez mon 'O'.
Si jamais ça ne t'embête pas j'ai un autre "petit" problème si tu à du temps.
Mon bout de code:
char P1 = chiffre.charAt(1);
int A1 = (int) (P1-'0');
char P2 = chiffre.charAt((2)&(3)); <==== C'est ici le soucis.
int A2 = (int) (P2-'0');
Bon je ne mis suis pas encore attardé dessus, mais j'en profite vue que je te répond.
Je souhaite que char P2 me récupère les caractères en position 2 et 3 mais ils ne doivent pas s'additionner ni fonctionner comme 2 caractères séparé et me renvoyer 2 valeurs, ils doivent se suivre pour formé un seul nombre. Exemple si je ne suis pas très clair:
Je tape:
9723610752762
Je souhaite récupéré 2 et 3 pour faire le nombre 23 qui va me permettre de récupéré la valeur à la 23ieme position d'un tableau.
Je viens à l'instant de pensé à faire comme cela... Je récupère chaque caractère l'un a part de l'autre et sur le premier je le multiplie par 10 puis j'additionne le 2ieme caractères et je renvoie la valeur obtenue pour mon tableau.
Quand pense tu?
Si jamais ça ne t'embête pas j'ai un autre "petit" problème si tu à du temps.
Mon bout de code:
char P1 = chiffre.charAt(1);
int A1 = (int) (P1-'0');
char P2 = chiffre.charAt((2)&(3)); <==== C'est ici le soucis.
int A2 = (int) (P2-'0');
Bon je ne mis suis pas encore attardé dessus, mais j'en profite vue que je te répond.
Je souhaite que char P2 me récupère les caractères en position 2 et 3 mais ils ne doivent pas s'additionner ni fonctionner comme 2 caractères séparé et me renvoyer 2 valeurs, ils doivent se suivre pour formé un seul nombre. Exemple si je ne suis pas très clair:
Je tape:
9723610752762
Je souhaite récupéré 2 et 3 pour faire le nombre 23 qui va me permettre de récupéré la valeur à la 23ieme position d'un tableau.
Je viens à l'instant de pensé à faire comme cela... Je récupère chaque caractère l'un a part de l'autre et sur le premier je le multiplie par 10 puis j'additionne le 2ieme caractères et je renvoie la valeur obtenue pour mon tableau.
Quand pense tu?
KX
Messages postés
16760
Date d'inscription
samedi 31 mai 2008
Statut
Modérateur
Dernière intervention
12 février 2025
3 020
Modifié par KX le 12/11/2012 à 17:47
Modifié par KX le 12/11/2012 à 17:47
Tu ne peux pas faire comme ça (pas du tout), charAt renvoie un caractère, donc il est tout à fait inconcevable qu'il puisse en renvoyer deux caractères, ou qu'il se comporte comme un nombre (qu'il n'est pas).
En outre le & a un sens très précis en Java puisqu'il s'agit d'un opérateur bit à bit (pour plus d'info regarde : ici) donc 2&3 vaut 2 et ça ne te renverra qu'un seul caractère.
Ce qu'il te faut c'est utiliser les méthodes substring et parseInt
PS. Les noms de variables sont censés être écrits avec des lettres minuscules.
En outre le & a un sens très précis en Java puisqu'il s'agit d'un opérateur bit à bit (pour plus d'info regarde : ici) donc 2&3 vaut 2 et ça ne te renverra qu'un seul caractère.
Ce qu'il te faut c'est utiliser les méthodes substring et parseInt
PS. Les noms de variables sont censés être écrits avec des lettres minuscules.
char p1 = chiffre.charAt(1); int a1 = (int) (p1-'0'); String p2 = chiffre.substring(2,3+1); //!\ le deuxième paramètre est exclusif int a2 = Integer.parseInt(p2);
Pulsar360
Messages postés
113
Date d'inscription
lundi 12 novembre 2012
Statut
Membre
Dernière intervention
29 août 2018
10
12 nov. 2012 à 18:31
12 nov. 2012 à 18:31
Ça n'a pas fonctionné car
String p2 = chiffre.substring(2,3); <=== problème ici.
int a2 = Integer.parseInt(p2);
me renvoie du coup la valeur du tableau qui se trouve en 2ieme position, et en plus si j'écrit:
String p2 = chiffre.substring(2,5); <=== pour récupéré les caractères en position 2 à 5
int a2 = Integer.parseInt(p2);
ca me renvoie une erreur de compilation.
Donc voici ma solution qui fonctionne à merveille:
char p2 = chiffre.charAt(2);
int a2 = (int) (p2-'0');
char p3 = chiffre.charAt(3);
int a3 = (int) (p3-'0');
int r2 = ((a2 * 10) + a3);
System.out.println(" Valeur : " + Tab2[r2]);
En tous cas je te remercie de ton aide, c'est super sympas de ta part.
Si jamais je bloque de nouveau je reposterais pour avoir ton aide si c'est possible.
MERCI
String p2 = chiffre.substring(2,3); <=== problème ici.
int a2 = Integer.parseInt(p2);
me renvoie du coup la valeur du tableau qui se trouve en 2ieme position, et en plus si j'écrit:
String p2 = chiffre.substring(2,5); <=== pour récupéré les caractères en position 2 à 5
int a2 = Integer.parseInt(p2);
ca me renvoie une erreur de compilation.
Donc voici ma solution qui fonctionne à merveille:
char p2 = chiffre.charAt(2);
int a2 = (int) (p2-'0');
char p3 = chiffre.charAt(3);
int a3 = (int) (p3-'0');
int r2 = ((a2 * 10) + a3);
System.out.println(" Valeur : " + Tab2[r2]);
En tous cas je te remercie de ton aide, c'est super sympas de ta part.
Si jamais je bloque de nouveau je reposterais pour avoir ton aide si c'est possible.
MERCI
KX
Messages postés
16760
Date d'inscription
samedi 31 mai 2008
Statut
Modérateur
Dernière intervention
12 février 2025
3 020
12 nov. 2012 à 18:48
12 nov. 2012 à 18:48
"substring(2,3); <=== problème ici."
J'ai modifié le code, le deuxième indice est exclusif, c'est à dire (2,3) va de 2 inclus à 3 exclus, donc pour aller de 2 à 3 inclus il faut mettre (2,4), ou pour s'en rappeler on met un +1.
Pareil pour récupérer les caractères de 2 à 5, il faut mettre substring(2,5+1);
"ca me renvoie une erreur de compilation."
Là ça paraît bizarre, il faudrait voir le message que te donne ton compilateur.
"voici ma solution qui fonctionne à merveille"
Evidemment que ça marche, mais c'est plus du bricolage qu'autre chose.
Voici un code, beaucoup plus simple et facilement réutilisable qui devrait aller :
J'ai modifié le code, le deuxième indice est exclusif, c'est à dire (2,3) va de 2 inclus à 3 exclus, donc pour aller de 2 à 3 inclus il faut mettre (2,4), ou pour s'en rappeler on met un +1.
Pareil pour récupérer les caractères de 2 à 5, il faut mettre substring(2,5+1);
"ca me renvoie une erreur de compilation."
Là ça paraît bizarre, il faudrait voir le message que te donne ton compilateur.
"voici ma solution qui fonctionne à merveille"
Evidemment que ça marche, mais c'est plus du bricolage qu'autre chose.
Voici un code, beaucoup plus simple et facilement réutilisable qui devrait aller :
int r2 = Integer.parseInt(chiffre.substring(2,3+1)); System.out.println(" Valeur : " + Tab2[r2]);