Java Scanner nextline Définir un nombre de case

Résolu/Fermé
Pulsar360 Messages postés 114 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 114 Date d'inscription lundi 12 novembre 2012 Statut Membre Dernière intervention 29 août 2018 - 12 nov. 2012 à 19:19
Bonjour,

Je suis en train de programmer en java. Je suis novice!!!! Et j'ai besoin d'une aide car je trouve pas m'a réponse.

J'ai rentré ceci pour pouvoir tapez un nombre sur la console pour qu'il soit traité:

System.out.println("Tapez vos 18 chiffres :");
long chi = code.nextLong();

MAIS ce que je souhaite, c'est que dans la console je ne puisse tapez QUE 18 caractères. En faite quand je doit tapez mes chiffres je souhaite qu'à partir du 18ieme chiffre la console ne rentre plus les caractères même si je continue de tapez au clavier (mon but est de ne pas devoir compter le nombre de chiffre que je tape à chaque fois et quand je vois que les chiffres ne s'affiche plus j'arrête).

Merci grandement pour votre aide!!!


Une autre question:
Est'il possible de traité un nombre plus grand qu'avec la méthode ""Long""? car avec Long je peut traité des nombres d'une longueur maximal de 18 chiffres. Et j'aimerais si possible utilisé une chaîne de "chiffre" (pas de caractère donc pas de String) d'environ 50 chiffre, exemple:
87643458593829384776542984312398050431847605931847

Re-merciii =)
A voir également:

4 réponses

KX Messages postés 16733 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 31 janvier 2024 3 015
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).

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.12
On obtient alors l'affichage des entiers BigInteger suivants :
123
456
-78
90
12
3
Pulsar360 Messages postés 114 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
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. ***");

}
}
1
KX Messages postés 16733 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 31 janvier 2024 3 015
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]);
0
Pulsar360 Messages postés 114 Date d'inscription lundi 12 novembre 2012 Statut Membre Dernière intervention 29 août 2018 10
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.
1
KX Messages postés 16733 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 31 janvier 2024 3 015
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 ?
0
Pulsar360 Messages postés 114 Date d'inscription lundi 12 novembre 2012 Statut Membre Dernière intervention 29 août 2018 10
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.
0
KX Messages postés 16733 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 31 janvier 2024 3 015
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).
0
Pulsar360 Messages postés 114 Date d'inscription lundi 12 novembre 2012 Statut Membre Dernière intervention 29 août 2018 10
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?
0
KX Messages postés 16733 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 31 janvier 2024 3 015
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.

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);
0
Pulsar360 Messages postés 114 Date d'inscription lundi 12 novembre 2012 Statut Membre Dernière intervention 29 août 2018 10
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
0
KX Messages postés 16733 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 31 janvier 2024 3 015
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 :

int r2 = Integer.parseInt(chiffre.substring(2,3+1));
System.out.println(" Valeur : " + Tab2[r2]);
0