CONNEXION
  • RetourJeux
    • Sorties
    • Hit Parade
    • Les + populaires
    • Les + attendus
    • Soluces
    • Tous les Jeux
    • Gaming
  • RetourActu Gaming
    • News
    • Astuces
    • Tests
    • Previews
    • Toute l'actu gaming
  • RetourBons plans
    • Bons plans
    • Bons plans Smartphone
    • Bons plans Hardware
    • Bons plans Image et Son
    • Bons plans Amazon
    • Bons plans Cdiscount
    • Bons plans Decathlon
    • Bons plans Fnac
    • Tous les Bons plans
  • RetourJVTech
    • Actus High-Tech
    • Intelligence Artificielle
    • Smartphones
    • Mobilité urbaine
    • Hardware
    • Image et son
    • Tutoriels
    • Tests produits High-Tech
    • Guides d'achat High-Tech
    • JVTech
  • RetourCulture
    • Actus Culture
    • Culture
  • RetourVidéos
    • A la une
    • Gaming Live
    • Vidéos Tests
    • Vidéos Previews
    • Gameplay
    • Trailers
    • Chroniques
    • Replay Web TV
    • Toutes les vidéos
  • RetourForums
    • Hardware PC
    • PS5
    • Switch 2
    • Xbox Series
    • Switch
    • Pokemon pocket
    • FC 25 Ultimate Team
    • League of Legends
    • Tous les Forums
  • PC
  • PS5
  • Xbox Series
  • Switch 2
  • PS4
  • One
  • Switch
  • iOS
  • Android
  • MMO
  • RPG
  • FPS
En ce moment Genshin Impact Valhalla Breath of the wild Animal Crossing GTA 5 Red dead 2
Liste des sujets

[code] Java détection d'un chiffre

LucasTR
LucasTR
Niveau 7
08 février 2021 à 17:17:58

Bonjour bonjour,

Toujours en train d'apprendre java et cette fois j'essaye de multiplier les caracteres par le nombre qui les suit, par ex "aab2" devient "aabb", "a4b" devient "aaaab" mais "4ab" reste "ab" vu que ça suit une chaine vide. En gros pour l'instant j'ai ça

public class HelloWorld
{
public static void main(String[] args)
{
String res="";
int out;
String s="ab3c";
int x=5;

for (int i = 0 ; i < s.length() ;i++){
out=i+1;
if (s.charAt(out) instanceof int) {
for (int j=0; j<out; j++){
res+=s.charAt(i);
}
}
}
System.out.print(res);
}
}

Et l'erreur réside dans le test pour savoir si c'est un nombre, internet n'est pas clair là dessus donc j'aimerais savoir si vous avez une idée de ce comment tester la nature du caractere..

LucasTR
LucasTR
Niveau 7
08 février 2021 à 17:50:29

Update:
j'ai remplacé le for le for etc par
if (s.charAt(out) instanceof Integer) {
for (int j=0; j<s.charAt(out); j++){
res+=s.charAt(i);
}
Mtn l'erreur c'est /HelloWorld.java:13: error: unexpected type
if (s.charAt(out) instanceof Integer) {
^
required: reference
found: char
1 error

ethyl-acetate
ethyl-acetate
Niveau 10
08 février 2021 à 20:10:21

Y'a pas un seul glandu qui s'est dit que les balises <code> c'était fait pour ça

Seelker
Seelker
Niveau 5
08 février 2021 à 20:33:24

Bonsoir,


StringBuilder sb = new StringBuilder();
char previous = ' ';
for (char letter : input.toCharArray()) {
    if(Character.isDigit(letter)){
        if(Character.isLetter(previous) && !Character.isDigit(previous) ){
            for(var i = 0; i < Integer.parseInt(String.valueOf(letter)) - 1; i++){
                sb.append(previous);
            }
        }
    }
    else{
        sb.append(letter);
    }
    previous = letter;
}
return sb.toString();

Je n'ai pas testé le cas d'utilisation lorsque tu as un nombre en premier caractère, et tu n'as pas expliqué ce qui se passe lorsque qu'il y a plusieurs nombres qui se suivent à la suite.

LucasTR
LucasTR
Niveau 7
08 février 2021 à 22:06:39

Le 08 février 2021 à 20:10:21 ethyl-acetate a écrit :
Y'a pas un seul glandu qui s'est dit que les balises <code> c'était fait pour ça

Dsl je suis pas habitué au forum jsp comment on fait

LucasTR
LucasTR
Niveau 7
08 février 2021 à 22:18:54

Je n'ai pas testé le cas d'utilisation lorsque tu as un nombre en premier caractère, et tu n'as pas expliqué ce qui se passe lorsque qu'il y a plusieurs nombres qui se suivent à la suite.

Quand il y a plusieurs nombres ça fait un nombre par exemple a12b affiche 12a puis un b, pour le nombre en premier caractère je pense que j'ai trouvé et le code que j'avais marche à l'exception de la condition mais honnêtement pour que plusieurs chiffres fassent un nombre je bloque totalement, tu aurais une idée de la formule stp ?

Seelker
Seelker
Niveau 5
09 février 2021 à 09:13:19

Yop, alors j'imagine qu'avec le temps et un peu de recherche, tu as trouvé ?

LucasTR
LucasTR
Niveau 7
09 février 2021 à 11:18:45

Le 09 février 2021 à 09:13:19 seelker a écrit :
Yop, alors j'imagine qu'avec le temps et un peu de recherche, tu as trouvé ?

Salut, j'ai trouvé une piste grâce aux regex en mettant en condition un match avec "[0-9]+" pour avoir tous les nombres ca me fait ça :
import java.util.regex.Matcher; import java.util.regex.Pattern; public class HelloWorld { public static void main(String[] args) { String res=""; int out; Pattern p = Pattern.compile("[0-9]"); String s="ab3c"; int x=5; for (int i = 0 ; i < s.length() ;i++){ Matcher m = p.matcher(s.charAt(out)); out=i+1; if (m.matches()) { for (int j=0; j<s.charAt(out); j++){ res+=s.charAt(i); } } System.out.print(res); } } }
mais cette fois l'erreur c'est /HelloWorld.java:14: error: incompatible types: char cannot be converted to CharSequence
Matcher m = p.matcher(s.charAt(out));
^
Note: Some messages have been simplified; recompile with -Xdiags:verbose to get full output
1 error
Je suis un peu perdu honnetement j'ai fait le tour des solutions mais elles sont pas claires..

Seelker
Seelker
Niveau 5
09 février 2021 à 14:28:07

En fait, pense surtout à regarder les signatures des méthodes que tu utilises.

L'endroit à regarder en ce qui concerne ton erreur est ici : quel type te retourne ceci : s.charAt(out) ?
Ensuite, que prend en argument cette méthode : p.matcher( <de quel type doit être cet argument ?>)

J'ai une solution qui ressemble plus à du C qu'à du Java, mais je veux bien te laisser un peu chercher avant de te cracher le code directement (ça me semble être un exercice de cours). Si la deadline est pour ce soir à minuit, c'est large, tu peux chercher un peu.

LucasTR
LucasTR
Niveau 7
09 février 2021 à 14:52:03

Le 09 février 2021 à 14:28:07 seelker a écrit :
En fait, pense surtout à regarder les signatures des méthodes que tu utilises.

L'endroit à regarder en ce qui concerne ton erreur est ici : quel type te retourne ceci : s.charAt(out) ?
Ensuite, que prend en argument cette méthode : p.matcher( <de quel type doit être cet argument ?>)

J'ai une solution qui ressemble plus à du C qu'à du Java, mais je veux bien te laisser un peu chercher avant de te cracher le code directement (ça me semble être un exercice de cours). Si la deadline est pour ce soir à minuit, c'est large, tu peux chercher un peu.

Si j'ai bien compris les fiches sur google s.charAt(out) retourne une lettre(ou un chiffre) et je me sers de ça pour la condition, pour p.matcher je crois que l'argument est un string du si s.charAt(out) tombe sur un chiffre dans le string il devrait matcher avec, dans le doute je viens de mettre
String k= new String();
k=k.valueOf(i);
Matcher m = p.matcher(j);
Pour essayer de convertir j en string et match mieux(si j'en crois la formule du livre) mais il y a encore plus d'erreur..
Effectivement c'est un exo de cours ! La deadline était pour hier mais le prof a bien voulu me laisser jusqua ce soir, je vais essayer de changer de méthode les regex ne marchent pas vraiment

Message édité le 09 février 2021 à 14:53:27 par LucasTR
Seelker
Seelker
Niveau 5
09 février 2021 à 15:42:45

Il y a plus simple, pense à ton cheminement de la chaine de texte que tu cherches à traiter.

Seelker
Seelker
Niveau 5
09 février 2021 à 17:59:26

Bon j'espère que tu as trouvé, ou du moins compris une des manières de faire.

Tu peux parcourir ta chaine, et chercher à voir si tu as une "Lettre", ou un "Nombre".
Si tu as une "Lettre", tu l'ajoutes à ta sortie résultat.
Si tu as un "Nombre", il faut continuer de parcourir la chaine jusqu'à ce que tu n'en rencontre plus.
En Java, je ne suis pas assez connaisseur pour bien faire les casts (transformations entre types). Je me suis débrouillé pour avoir un Integer à gérer à la fin pour ajouter le nombre de lettres qu'il faut (moins une, car la première est déjà écrite, juste avant la présence d'un nombre).
Je n'oublie pas de changer mon index de parcours de la chaine d'entrée pour m'aligner sur l'index du dernier nombre que je rencontre (le prochain tour de boucle se positionnera sur le caractère suivant, s'il y en a un).

Voilà le code, mais utilise l'explication d'avant si tu veux tenter de ton côté. Pour ce soir 19h ou 20h ça devrait être bon, même minuit, tu sais que tu as de la marge comme ça.



Code de la fonction / méthode souhaitée :

    public String transform(String input) {
        StringBuilder sbResult = new StringBuilder();
        StringBuilder sbNumber = new StringBuilder();
        char[] initialText = input.toCharArray();
        for (var index = 0; index < initialText.length; index++) {
            char letter = initialText[index];
            if(Character.isDigit(letter)){
                sbNumber.append(letter);
                int numberIndex = index+1;
                while(numberIndex < initialText.length && Character.isDigit(initialText[numberIndex]) )
                {
                    sbNumber.append(initialText[numberIndex]);
                    numberIndex++;
                }
                int occurrence = Integer.parseInt(sbNumber.toString());
                sbNumber = new StringBuilder();
                for(int i = 0; i < occurrence-1; i++){
                    if(index-1 >= 0)
                        sbResult.append(initialText[index-1]);
                }
                index = numberIndex-1;
            }
            else{
                sbResult.append(letter);
            }
        }
        return sbResult.toString();
    }


Cas de tests vérifiés avec statut OK avec JUnit :

    @Test
    public void firstSimple3Test(){
        CharMultiplier charMultiplier = new CharMultiplier();
        String input = "aab3";
        String result = charMultiplier.transform(input);
        Assert.assertEquals("aabbb", result);
    }

    @Test
    public void Simple4Test(){
        CharMultiplier charMultiplier = new CharMultiplier();
        String input = "aab4";
        String result = charMultiplier.transform(input);
        Assert.assertEquals("aabbbb", result);
    }

    @Test
    public void DoubleTest(){
        CharMultiplier charMultiplier = new CharMultiplier();
        String input = "a2b3";
        String result = charMultiplier.transform(input);
        Assert.assertEquals("aabbb", result);
    }

    @Test
    public void NumberFirstTest(){
        CharMultiplier charMultiplier = new CharMultiplier();
        String input = "2ab";
        String result = charMultiplier.transform(input);
        Assert.assertEquals("ab", result);
    }
    @Test
    public void NumberFirstAndLastTest(){
        CharMultiplier charMultiplier = new CharMultiplier();
        String input = "2ab5";
        String result = charMultiplier.transform(input);
        Assert.assertEquals("abbbbb", result);
    }

    @Test
    public void ManyNumber12Test(){
        CharMultiplier charMultiplier = new CharMultiplier();
        String input = "2a12b";
        String result = charMultiplier.transform(input);
        Assert.assertEquals("aaaaaaaaaaaab", result);
    }

    @Test
    public void ManyNumber21Test(){
        CharMultiplier charMultiplier = new CharMultiplier();
        String input = "2a21b2";
        String result = charMultiplier.transform(input);
        Assert.assertEquals("aaaaaaaaaaaaaaaaaaaaabb", result);
    }

N'hésite pas si tu as des questions, c'est surtout ce que toi tu comprends du problème et ce que tu en retires pour la suite qui est important.

LucasTR
LucasTR
Niveau 7
09 février 2021 à 19:48:52

Merci ! Du coup je sais pas où répondre mais il y a pas mal de choses que j'ai pas compris du coup pendant les heures qu'il reste je vais essayer de changer mon propre code pour avoir le même résultat vu que si j'ai bien compris là il y a la solution pour savoir le type de la variable

Seelker
Seelker
Niveau 5
09 février 2021 à 20:10:59

Les tests ne sont là qu'à titre d'exemples. Tu n'as pas besoin de trop t'en préoccuper, ils m'ont surtout servi à valider le comportement.

La variable Input est de type String, donc je fais "toCharArray()" pour avoir un tableau de char, que je peux utiliser dans une boucle for.
La boucle while me permet de vérifier, si je tombe sur un Nombre, de rechercher tous les nombres suivants, et de les ajouter à un StringBuilder. Cette classe permet de façonner un String qui correspondra au "nombre" d'occurrences d'une lettre. faire ".toString()" à partir d'une instance de StringBuilder permet de générer la chaine finale, après avoir utilisé ".append()" pour ajouter des éléments dedans.

Dans la ligne ci dessous :


int occurrence = Integer.parseInt(sbNumber.toString());

Le but est d'avoir un type int à la fin, pour l'utiliser comme un nombre limite dans la boucle for suivante. J'utilise donc le StringBuilder dans lequel j'ai ajouté les caractères étant des nombres qui se suivent, et j'utilise Integer.parseInt pour transformer la chaine String résultante du SB pour avoir au final une variable de type int.

Le reste, pour réaffecter l'index, et savoir qu'il faut faire "occurrence-1" (car on a déjà écrit une lettre une première fois lors d'un tour de boucle concernant cette lettre avant un nombre), ce sont surtout des maths et la compréhension de l'où on se trouve dans le tableau initialText.
"index" correspond à la variable pour le traitement de la chaine complète, numberIndex sert surtout à suivre le traitement de la sous-chaine correspondant à un nombre. J'ai fais comme cela, mais on peut certainement trouver une autre solution plus optimisée.

Si les StringBuilder te perturbent, fait juste de la concaténation de chaine String comme tu dois connaitre, ça simplifiera aussi ta compréhension si tu n'es pas habitué.

Message édité le 09 février 2021 à 20:11:19 par Seelker
LucasTR
LucasTR
Niveau 7
09 février 2021 à 22:12:53

Donc pour utiliser un String dans une boucle for on est obligé de passer par un array? Si j'en, crois google c'est juste parce que le string est immuable c'est ça ?
Le whi:le j'ai pas compris les détails mais en gros la condition c'est tant qu'il y n'y a pas un type différent ?
Je crois que j'ai à peu près compris le principe même si forcément le code lui même pas trop..
Du coup le StringBuilder on peut le modifier avec sb.quelquechose c'est ça?

Seelker
Seelker
Niveau 5
09 février 2021 à 23:23:46

Donc pour utiliser un String dans une boucle for on est obligé de passer par un array? Si j'en, crois google c'est juste parce que le string est immuable c'est ça ?

Je ne connais plus exactement si c'était possible en Java, je viens du C# et en C#, un string est bien assimilé à un tableau de char. Donc ici j'ai fais ça pour pour avoir le même résultat. Je veux un tableau à parcourir avec un index numérique.

Le whi:le j'ai pas compris les détails

Il sert à retrouver un groupe de Nombres qui se succèdent, ce qu'il manquait entre la première version que j'avais faite, et la dernière.

en gros la condition c'est tant qu'il y n'y a pas un type différent ?

Tant qu'on a pas dépassé la taille de la chaine d'entrée, et tant qu'on a pas autre chose qu'un chiffre, vu que l'on souhaite avoir tous les chiffres avant la prochaine lettre pour construire le nombre entier.

Je crois que j'ai à peu près compris le principe même si forcément le code lui même pas trop..

Le code est fais à la va-vite, la seule fiabilité que j'en ai, c'est qu'il passe les tests. La méthode est loin d'une solution propre d'une appli en production (quoi qu'en disant ça... par moment... ce que l'on voit...)

Du coup le StringBuilder on peut le modifier avec sb.quelquechose c'est ça?

C'est la méthode append() qui permet d'ajouter des caractères ou des bouts de texte. Mais encore une fois c'est moi qui ai utilisé ça comme ça, on peut faire autrement avec des String simples concaténés.

Message édité le 09 février 2021 à 23:24:08 par Seelker
LucasTR
LucasTR
Niveau 7
10 février 2021 à 15:36:38

Hmm je crois que jai compris en gros si je résume la méthode c'est:
on construit les variables qui stock le résultat final, les nombres et on met un char pour pouvoir modifier le texte l'utiliser dans le for qui suit
Si on detecte un nombre avec ce if on vérifie s'il en a juste apres
Puis on fait un autre for pour remplacer les nombres par la lettre juste avant ?

Seelker
Seelker
Niveau 5
10 février 2021 à 16:48:45

on construit les variables qui stock le résultat final, les nombres et on met un char pour pouvoir modifier le texte l'utiliser dans le for qui suit

En fait pas exactement, on a deux SB différents : on a bien une variable pour le résultat, et une pour gérer les suites de chiffres.
Pour celui des chiffres, une fois qu'on a terminé de lire un nombre en entier (c'est à dire qu'on voit que le caractère suivant le dernier chiffre n'est pas un nombre, ou la fin de la chaine), on récupère le nombre d'occurrences à écrire pour une lettre, et on réinitialise le SB pour la prochaine fois (un nouveau nombre qui suivra une lettre) :


sbNumber = new StringBuilder();

Puis on fait un autre for pour remplacer les nombres par la lettre juste avant ?

Le for qui suit permet d'ajouter les lettres au SB concernant le résultat : sbResult
On ne remplace pas, je ne fais que des append, je ne fais qu'ajouter dans ce sbResult.
Par contre je réinitialise celui concernant uniquement les nombres à chaque fois que je détecte qu'on a terminé de lire un nombre.

LucasTR
LucasTR
Niveau 7
11 février 2021 à 12:07:35

Le 10 février 2021 à 16:48:45 seelker a écrit :

on construit les variables qui stock le résultat final, les nombres et on met un char pour pouvoir modifier le texte l'utiliser dans le for qui suit

En fait pas exactement, on a deux SB différents : on a bien une variable pour le résultat, et une pour gérer les suites de chiffres.
Pour celui des chiffres, une fois qu'on a terminé de lire un nombre en entier (c'est à dire qu'on voit que le caractère suivant le dernier chiffre n'est pas un nombre, ou la fin de la chaine), on récupère le nombre d'occurrences à écrire pour une lettre, et on réinitialise le SB pour la prochaine fois (un nouveau nombre qui suivra une lettre) :


sbNumber = new StringBuilder();

Puis on fait un autre for pour remplacer les nombres par la lettre juste avant ?

Le for qui suit permet d'ajouter les lettres au SB concernant le résultat : sbResult
On ne remplace pas, je ne fais que des append, je ne fais qu'ajouter dans ce sbResult.
Par contre je réinitialise celui concernant uniquement les nombres à chaque fois que je détecte qu'on a terminé de lire un nombre.

Ah je crois que j'ai compris merci !
Du coup en gros dans mon code de base même en ayant trouvé comment comparer les types ça aurait pas marché parce ce que je me basais sur un string et non un char ? A part ça ça allait ?

Seelker
Seelker
Niveau 5
11 février 2021 à 12:16:35

Dans le code de base, il semble que tu essaies d'assimiler un char à un int, ou un Integer, et il manquait surement la gestion de "nombre" (là avec ce que tu proposais, je crois que tu ne cherchais qu'un seul chiffre) :

if (s.charAt(out) instanceof int) {

La variable "out" ne me semblait pas être la bonne valeur à mettre dans la boucle for pour limiter j, je pense que tu voulais justement mettre la valeur numérique que tu trouves en tant que int à une position donnée :

for (int j=0; j<out; j++){

Et tu ne gérais pas encore le premier nombre j'ai l'impression (je n'ai pas testé, j'ai juste rédigé mon code).

Sous forums
  • Aide à l'achat Mac
  • Création de Jeux
  • Linux
  • Programmation
  • Création de sites web
  • Internet
  • Steam Deck
  • Macintosh
  • Hardware
La vidéo du moment