Partage
  • Partager sur Facebook
  • Partager sur Twitter

Condition if avec un string comme condition

    30 octobre 2018 à 9:56:41

    Bonjour, je souhaiteras exécuter des condition if sous la forme suivante

    boolean b=true;
    String condition="b==true";
    
    if(condition)
    {
       ...
    }
    else
    {
       ...
    }


    J'aurais donc voulu savoir si Java permettais d’exécuter des lignes de code contenu dans un String et si oui comment ?

    Merci

    • Partager sur Facebook
    • Partager sur Twitter
      31 octobre 2018 à 19:14:37

      https://javabeat.net/the-java-6-0-compiler-api/
      • Partager sur Facebook
      • Partager sur Twitter
        1 novembre 2018 à 0:07:54

        Bonjour,

        oui.

        Au-revoir.

        • Partager sur Facebook
        • Partager sur Twitter
          1 novembre 2018 à 1:01:00

          Bonjour à toi necbfrt,

          Premièrement, ne tiens pas compte des deux commentaires précédents. Notamment celui juste au-dessus du mien. Les gens aiment perdre du temps et faire perdre du temps il faut croire...

          Deuxièmement, l'évaluation de string directement comme cela est assez fortement déconseillé car pas "secure". Tu peux facilement faire des erreurs ou causer des petits soucis à droite à gauche.. 

          Ne peux tu pas employer un autre moyen ? Parser le string par exemple ?

          J' espère t'avoir aidé, n'hésite pas si tu as besoin d'aide :) 

          • Partager sur Facebook
          • Partager sur Twitter
            1 novembre 2018 à 1:54:43

            Salut,

            Il y aurait peut-être moyen de bidouiller quelque chose avec le ScriptEngine, mais ce n'est pas trop conseillé (ne serait-ce que parce que ce n'est pas fait pour ça).

            Pour le coup, la meilleure solution serait de faire/d'utiliser un petit parser capable de reconnaitre des conditions et de les évaluer. Mais ça demande un petit peu plus de travail.

            Et quand je parle de parser, c'est genre un petit truc avec ANTLR ou autre outil du genre. Faire ça à base de regex ça pourrait fonctionner, mais bon.. ça sera très vite inadapté si tu commences à avoir des expressions complexes.

            Bye

            • Partager sur Facebook
            • Partager sur Twitter
              1 novembre 2018 à 14:00:44

              L'évaluation d'un "bout de code" en java est possible de deux manières :

              => Soit tu as des notions correctes en théorie des langages, c'est à dire en compilation, et tu écris un évaluateur récursif qui va faire ce dont tu as besoin, selon une grammaire que tu définis, et qui peut être plus ou moins complexe. Cette première méthode nécessite un background que très peu de gens ont, mais elle te permet de maitriser à 100% le résultat...

              => Soit tu veux une solution "out of the box" sans savoir comment ça marche, pourvu que ça le fasse...la réponse se trouve dans des interpreteurs ECMAScript, qui sont des implémentation de la norme JAVASCRIPT correspondante et qui permettent, dans un programme JAVA, d'instancier un interpreteur, de le charger avec le script à exécuter, et de lancer cette exécution, tout en passant des variables d'entrée et récupérant d'autres variables en retour. Dans ce second cas, b serait à passer en variable IN, ta chaine de caractère serait le code que tu placerais dans un corps de fonction "function toto(b) { return "+condition+" ;}". Et tu récupèrerais le retour de la fonction (toto) comme résultat de l'évaluation du script.

              La seconde façon est très lourde en exécution, mais très polyvalente. Elle permet d'insérer du script dans n'importe quel programme....la première est performante (c'est relatif) mais encore une fois, il faut savoir le faire.

              Pour ce qui est des librairies de script engine, il en existe plusieurs. Google va bien t'aider sur ce coup là ;o)

              • Partager sur Facebook
              • Partager sur Twitter
                1 novembre 2018 à 14:02:23

                Sanzen a écrit:

                Bonjour à toi necbfrt,

                Premièrement, ne tiens pas compte des deux commentaires précédents. Notamment celui juste au-dessus du mien. Les gens aiment perdre du temps et faire perdre du temps il faut croire...

                Deuxièmement, l'évaluation de string directement comme cela est assez fortement déconseillé car pas "secure". Tu peux facilement faire des erreurs ou causer des petits soucis à droite à gauche.. 

                Ne peux tu pas employer un autre moyen ? Parser le string par exemple ?

                J' espère t'avoir aidé, n'hésite pas si tu as besoin d'aide :) 

                Pourquoi ne pas tenir compte de mon message ... je lui ai bien fourni un url utile -_- c'est pas gentil :(

                3ch0 a écrit:

                Salut,

                Il y aurait peut-être moyen de bidouiller quelque chose avec le ScriptEngine, mais ce n'est pas trop conseillé (ne serait-ce que parce que ce n'est pas fait pour ça).

                Pour le coup, la meilleure solution serait de faire/d'utiliser un petit parser capable de reconnaitre des conditions et de les évaluer. Mais ça demande un petit peu plus de travail.

                Et quand je parle de parser, c'est genre un petit truc avec ANTLR ou autre outil du genre. Faire ça à base de regex ça pourrait fonctionner, mais bon.. ça sera très vite inadapté si tu commences à avoir des expressions complexes.

                Bye

                Peut-etre utiliser je compiler API -_- ????? pourquoi recoder ce que java offre .. ?
                Je repaste le lien juste au cas ou ...

                https://javabeat.net/the-java-6-0-compiler-api/


                Parce que je suis gentil :
                (debut du dernier paragraphe .. )
                [...] 

                Compilation of Java Source from a String object

                Having discussed about the various ways of compiling java file sources, it’s now time to look at how to compile a java source that is encapsulated in a string object.

                [...]




                -
                Edité par CrevetteMagique 1 novembre 2018 à 14:06:20

                • Partager sur Facebook
                • Partager sur Twitter
                  1 novembre 2018 à 16:09:33

                  Salut,

                  On ne lui a pas proposé parce que c'est pas ce qu'il recherche. Il ne cherche pas à compiler à la voler un code java (complet), seulement évaluer une condition qui se trouve dans une chaine de caractères.

                  EDIT (j'avais pas vu la variable au début..) : Enfin seulement évaluer... Il y aurait aussi une correspondance à faire avec des variables dans le code même. Et là, c'est une autre affaire...

                  -------------------------------

                  SébastienGRENIER1 a écrit:

                  L'évaluation d'un "bout de code" en java est possible de deux manières :

                  => Soit tu as des notions correctes en théorie des langages, c'est à dire en compilation, et tu écris un évaluateur récursif qui va faire ce dont tu as besoin, selon une grammaire que tu définis, et qui peut être plus ou moins complexe. Cette première méthode nécessite un background que très peu de gens ont, mais elle te permet de maitriser à 100% le résultat...

                  => Soit tu veux une solution "out of the box" sans savoir comment ça marche, pourvu que ça le fasse...la réponse se trouve dans des interpreteurs ECMAScript, qui sont des implémentation de la norme JAVASCRIPT correspondante et qui permettent, dans un programme JAVA, d'instancier un interpreteur, de le charger avec le script à exécuter, et de lancer cette exécution, tout en passant des variables d'entrée et récupérant d'autres variables en retour. Dans ce second cas, b serait à passer en variable IN, ta chaine de caractère serait le code que tu placerais dans un corps de fonction "function toto(b) { return "+condition+" ;}". Et tu récupèrerais le retour de la fonction (toto) comme résultat de l'évaluation du script.

                  La seconde façon est très lourde en exécution, mais très polyvalente. Elle permet d'insérer du script dans n'importe quel programme....la première est performante (c'est relatif) mais encore une fois, il faut savoir le faire.

                  Pour ce qui est des librairies de script engine, il en existe plusieurs. Google va bien t'aider sur ce coup là ;o)


                  Pour faire ce qu'il souhaite faire, il n'a pas besoin d'un background de dingue pour écrire un petit évaluateur. C'est largement à sa portée en bossant un peu dessus et en utilisant un bon outil.

                  La 2e option, en utilisant ScriptEngine (pour le coup, autant utiliser ce qui existe déjà dans le langage java),  c'est encore une fois pas une bonne idée. Déjà parce que c'est lourd pour un truc aussi simple et surtout pour des raisons de sécurité. A moins qu'il sache vraiment d'où vienne ses conditions, charger un code comme ça à évaluer, c'est hyper dangereux...

                  En revanche, la 2e option fait gagner du temps, ça demande moins de travail.

                  -
                  Edité par 3ch0 2 novembre 2018 à 7:21:04

                  • Partager sur Facebook
                  • Partager sur Twitter
                    1 novembre 2018 à 23:30:40

                    J'ai du mal à imaginer un cas ou cela serai nécessaire, est ce que tu pourrais nous donner le contexte ? il doit surement exister une meilleur solution que de mélanger des variables dans des string et dans le code compiler

                    Sinon je pense qu'un "parseur" fait main est la meilleur solution mais c'est vraiment limité comme solution   

                    • Partager sur Facebook
                    • Partager sur Twitter
                      2 novembre 2018 à 7:25:44

                      Je ne l'avais pas vu au début, mais dans son exemple, il fait aussi appel à une variable déclarée dans le code Java. Là pour le coup, il peut oublier le parser. Peut-être le ScriptEngine s'il peut déplacer ses variables dans le script à évaluer, mais bon ça parait être une sacré bidouille et ça reste moche. Sinon, effectivement comme l'a proposé Zerotisme, faire une compilation à la volée. En gros il génère le code complet de la classe dans une chaine de caractères, il la compile depuis un String et après ça il pourra l'exploiter, mais là aussi, ça reste moche comme solution (mais pour ce qu'il veut faire, je ne suis pas certain qu'il existe moins moche...) et les mêmes problèmes de sécurité que le ScriptEngine s'appliquent.

                      Bref, à voir si on peut avoir un peu plus d'informations, mais ça me parait pas une bonne idée de vouloir faire ça :/

                      -
                      Edité par 3ch0 2 novembre 2018 à 7:26:49

                      • Partager sur Facebook
                      • Partager sur Twitter
                        2 novembre 2018 à 23:23:51

                        3ch0 a écrit:

                        Je ne l'avais pas vu au début, mais dans son exemple, il fait aussi appel à une variable déclarée dans le code Java. Là pour le coup, il peut oublier le parser. 


                        Pourquoi ?
                        • Partager sur Facebook
                        • Partager sur Twitter
                          3 novembre 2018 à 9:26:48

                          Splintz a écrit:

                          3ch0 a écrit:

                          Je ne l'avais pas vu au début, mais dans son exemple, il fait aussi appel à une variable déclarée dans le code Java. Là pour le coup, il peut oublier le parser. 


                          Pourquoi ?


                          Parce qu'il va falloir faire une correspondance avec les variables du code même et ça c'est du boulot, beaucoup de boulot. Un b == true dans son code, c'est facile à parser. Mais b ça peut-être tout et n'importe quoi, c'est qu'une chaîne de caractères à ce niveau. Donc pour aller faire le lien avec la variable du code, ça va demander plus de travail

                          -
                          Edité par 3ch0 3 novembre 2018 à 9:27:28

                          • Partager sur Facebook
                          • Partager sur Twitter
                            3 novembre 2018 à 10:04:38

                            3ch0 a écrit:

                            Parce qu'il va falloir faire une correspondance avec les variables du code même et ça c'est du boulot, beaucoup de boulot. Un b == true dans son code, c'est facile à parser. Mais b ça peut-être tout et n'importe quoi, c'est qu'une chaîne de caractères à ce niveau. Donc pour aller faire le lien avec la variable du code, ça va demander plus de travail


                            Le problème c'est qu'on ne sait pas ce qu'il veut faire, si il n'y a que quelques cas à prendre en compte le parseur reste surement la méthode la plus simple
                            • Partager sur Facebook
                            • Partager sur Twitter
                              3 novembre 2018 à 10:33:47

                              En fait évaluer une chaîne de caractères comme code java est une très mauvaise manière de penser. Vous devriez l'amener à penser d'une manière différente en proposant par exemple de donner le problème de départ et réfléchir avec lui à la meilleure solution.

                              Ce genre d'utilisation n'est déjà pas adapté aux langages python, C, C++ et donc je pense qu'il en est de même pour Java.

                              • Partager sur Facebook
                              • Partager sur Twitter

                              Bonne journée...

                                6 novembre 2018 à 12:26:31

                                Alors merci pour vos réponses. Pour vous répondre je vais essayer de détailler mon cas :

                                Pour un projet je doit créer un formulaire et selon comment se formulaire est rempli le traitement doit exécuter ou non certaines choses (par exemple si on coche la radioBox r1 et la radioBox r4 alors on lance le traitement t1).

                                Jusque là rien de bien compliqué sauf que ces conditions qui doivent aboutir à des traitements doivent être créer par l'utilisateur et non pas par moi, donc en résumé l'utilisateur doit pouvoir dire "je ne veux pas que si r1 et r4 soit coché on lance le traitement t1, pour lancer le traitement t1 il faut que (r1 et r3) ou (r2) soit cochées".

                                En gros il faut que l'utilisateur puisse créer ses propres condition et au final ses propres if(...)  {...}

                                C'est pourquoi je souhaite enregistrer ces conditions dans des string car je ne les connaitrais pas en avance.

                                • Partager sur Facebook
                                • Partager sur Twitter
                                  6 novembre 2018 à 14:00:51

                                  On pourrait utiliser un dictionnaire peut-être ? Avec les clés représentant les traitements et les valeurs représentants les conditions.

                                  Comment créer un dictionnaire ?

                                  • Partager sur Facebook
                                  • Partager sur Twitter

                                  Bonne journée...

                                    6 novembre 2018 à 15:17:59

                                    Le dictionnaire répond simplement à la question du stockage de mes traitements et de mes conditions, mais cela ne répond pas au réel problème qui est de pouvoir exécuter des lignes de commande dans un string.

                                    En gros il me faudrait une méthode executeString qui exécute des lignes de commandes contenues dans un string de tel sorte que je puisse faire :

                                    ArrayList<ConditionTraitement> conditionTraitement =new ConditionTraitement<>();
                                    //Un ConditionTraitement se compose d'un String conditions et d'un String traitement
                                    
                                    for(ConditionTraitement t : conditionTraitement)
                                    {
                                       if( executeString( t.getConditions() ) )
                                       {
                                           executeString( t.getTraitement() );
                                        }
                                    }





                                    • Partager sur Facebook
                                    • Partager sur Twitter
                                      6 novembre 2018 à 21:27:12

                                      En gros tu as un petit langage derrière ? Dans ce cas, il faudrait que tu définisses la grammaire (les règles de construction et tout), le parser, etc. et que tu interprètes derrière
                                      • Partager sur Facebook
                                      • Partager sur Twitter
                                        6 novembre 2018 à 23:23:36

                                        J'ai pas tout compris mais si c'est que pour l'évaluation de conditions les cas sont vachement limité et un "parseur" devrait suffire. Apres je sais pas à quoi ressemble ton interface mais tu peux imaginer une interface ou l'utilisateur place/relie des blocs un peu comme Node-red ou lego mindstorm.
                                        • Partager sur Facebook
                                        • Partager sur Twitter
                                          7 novembre 2018 à 15:10:05

                                          3ch0 a écrit:

                                          En gros tu as un petit langage derrière ? Dans ce cas, il faudrait que tu définisses la grammaire (les règles de construction et tout), le parser, etc. et que tu interprètes derrière


                                          Merci pour ta réponse mais cette solution ne me semble pas utilisable par moi même, tous simplement car je ne m'y connais pas assez en théorie des langages et que je n'ai pas le temps de m'y former et de créer ma grammaire etc. Surtout que ce problème n'est qu'une infime partie de mon projet et j'ai beaucoup de travail ailleurs.

                                          Splintz a écrit:

                                          J'ai pas tout compris mais si c'est que pour l'évaluation de conditions les cas sont vachement limité et un "parseur" devrait suffire. Apres je sais pas à quoi ressemble ton interface mais tu peux imaginer une interface ou l'utilisateur place/relie des blocs un peu comme Node-red ou lego mindstorm.


                                          Je vais essayer d'être plus simple, en ne tenant pas compte de mon projet, de ses utilisateurs etc. Il me fraudais simplement une méthode que l'on appellera par exemple executeString qui prend en argument un String et qui exécute le code compris dans le String, que ce soit pour l’exécuter dans une condition if ou non. Il me fraudais simplement un moyen d’exécuter du code qui est dans un String.
                                          • Partager sur Facebook
                                          • Partager sur Twitter
                                            7 novembre 2018 à 15:28:30

                                            C'est possible "rapidement" que si c'est du code Java que tu as dans ton String ou un code géré par le ScriptEngine (à toi de faire attention au contenu après). Des solutions t'ont déjà été proposées (compilation à la volée ou ScriptEngine). Autrement faudra faire un langage et ce qui va avec (ou autre méthode qui demandera quoi qu'il arrive du taff).

                                            En Java, tu ne peux pas directement exécuter du code dans un string (ou pas que je sache). Autrement il va falloir revoir ta façon de faire ou le langage que tu utilises pour résoudre ce problème.

                                            • Partager sur Facebook
                                            • Partager sur Twitter
                                              7 novembre 2018 à 15:41:16

                                              necbfrt a écrit:

                                              Le dictionnaire répond simplement à la question du stockage de mes traitements et de mes conditions, mais cela ne répond pas au réel problème qui est de pouvoir exécuter des lignes de commande dans un string.


                                              Hmmm... comment dire, la solution n'est pas d'évaluer un objet String en code Java ! Ce n'est jamais (99% des cas) utile de faire cela... Il faut revoir ta manière de résoudre ton problème. Je t'ai proposé une solution où tes conditions se trouveraient dans un tableau de String et à l'aide d'une boucle for itérant sur les clés de dictionnaires, tu détecterais quelle condition est présente, afin d'en exécuter la clé (traitement).

                                              Ce n'est pas compliqué, mais ton problème étant peu précis, tu reçois une réponse adaptée aux peu d'informations données.

                                              Çà répond au problème, mais j'avoue que d'autres solutions existent en séparant conditions dans un tableau et traitements dans un autre, seulement je trouve cela moins élégant.

                                              • Partager sur Facebook
                                              • Partager sur Twitter

                                              Bonne journée...

                                                8 novembre 2018 à 9:37:19

                                                3ch0 a écrit:

                                                C'est possible "rapidement" que si c'est du code Java que tu as dans ton String ou un code géré par le ScriptEngine (à toi de faire attention au contenu après). Des solutions t'ont déjà été proposées (compilation à la volée ou ScriptEngine). Autrement faudra faire un langage et ce qui va avec (ou autre méthode qui demandera quoi qu'il arrive du taff).

                                                En Java, tu ne peux pas directement exécuter du code dans un string (ou pas que je sache). Autrement il va falloir revoir ta façon de faire ou le langage que tu utilises pour résoudre ce problème.


                                                Merci pour ta réponse je vais m'attarder sur ces deux solutions.

                                                Fredo54 a écrit:

                                                necbfrt a écrit:

                                                Le dictionnaire répond simplement à la question du stockage de mes traitements et de mes conditions, mais cela ne répond pas au réel problème qui est de pouvoir exécuter des lignes de commande dans un string.


                                                Hmmm... comment dire, la solution n'est pas d'évaluer un objet String en code Java ! Ce n'est jamais (99% des cas) utile de faire cela... Il faut revoir ta manière de résoudre ton problème. Je t'ai proposé une solution où tes conditions se trouveraient dans un tableau de String et à l'aide d'une boucle for itérant sur les clés de dictionnaires, tu détecterais quelle condition est présente, afin d'en exécuter la clé (traitement).

                                                Ce n'est pas compliqué, mais ton problème étant peu précis, tu reçois une réponse adaptée aux peu d'informations données.

                                                Çà répond au problème, mais j'avoue que d'autres solutions existent en séparant conditions dans un tableau et traitements dans un autre, seulement je trouve cela moins élégant.


                                                Désolé de te faire répéter mais je n'ai pas compris ta solution, tu me conseille d'utiliser un dictionnaire mais ensuite je ne comprend pas quoi faire. Si j'ai bien compris tu me conseille de faire ceci :

                                                Map<String,String> dico;
                                                
                                                for(boucle sur toutes les clé de dico)
                                                {
                                                   if( clé ==vrai)
                                                       traitementContenuDansDico();
                                                }

                                                Cependant cela reviens au même problème, comment je fais pour testé clé == vrai et comment je fais traitementContenuDansDico. Pourrais tu m'expliquer ? Ou alors il suffit de  reprendre avec de la compilation à la volée ou ScriptEngine?

                                                Et en réponse à 3ch0 oui le code java contenu dans mes string qui seront executé seront testé avant utilisation donc à ce niveau là pas de risque.

                                                • Partager sur Facebook
                                                • Partager sur Twitter
                                                  8 novembre 2018 à 10:53:55

                                                  Bonjour,

                                                  J'ai lu en diagonal, donc désolé si la réponse n'est pas parfaitement adaptée au problème. Mais, pour proposer une solution qui y répond...même si c'est une bombe nucléaire pour tuer une mouche :

                                                  -> Moteur de script Groovy : http://www.groovy-lang.org/

                                                  A partir de là, tu peux créer un script "modèle" qui contient une méthode "evaluate()" avec un texte "pattern" ( par exemple => return "#TO_EVAL#" ; ) que tu remplaces par ce que tu veux évaluer ( replace("#TO_EVAL#, ma_condition) ). Tu peux vérifier la validité du script avant l'appel... Tu appelles la méthode du script .groovy et tu récupères le résultat. Tu trouveras des exemples si tu demandes à Google.

                                                  -
                                                  Edité par CeBiM 8 novembre 2018 à 10:55:34

                                                  • Partager sur Facebook
                                                  • Partager sur Twitter
                                                  Les seules questions bêtes sont celles qui ne sont pas posées. Mieux vaut paraître bête une fois que de le rester à vie."Vis comme si tu devais mourir demain. Apprends comme si tu devais vivre toujours."
                                                    8 novembre 2018 à 14:48:03

                                                    necbfrt a écrit:

                                                    Désolé de te faire répéter mais je n'ai pas compris ta solution, tu me conseille d'utiliser un dictionnaire mais ensuite je ne comprend pas quoi faire. Si j'ai bien compris tu me conseille de faire ceci :

                                                    Map<String,String> dico;
                                                    
                                                    for(boucle sur toutes les clé de dico)
                                                    {
                                                       if( clé ==vrai)
                                                           traitementContenuDansDico();
                                                    }

                                                    Non ça ressemblerait plutôt à

                                                    Map<String,String[]> dico;
                                                    
                                                    for(traitement dans dico)
                                                    {
                                                       if(condition dans conditions possibles)
                                                           traitement();
                                                           break;
                                                    }
                                                    • où traitement est un objet fonction non exécuté (mettre les parenthèses comme ci-dessus pour son exécution).
                                                    • où conditions possibles est la liste des condition où le traitement s'appliquera donc dico[traitement]
                                                    • où les clés représentent les traitements

                                                    Bref avec le vrai problème ça serait plus simple à expliquer :-°

                                                    • Partager sur Facebook
                                                    • Partager sur Twitter

                                                    Bonne journée...

                                                      8 novembre 2018 à 15:26:27

                                                      CeBiM a écrit:

                                                      Bonjour,

                                                      J'ai lu en diagonal, donc désolé si la réponse n'est pas parfaitement adaptée au problème. Mais, pour proposer une solution qui y répond...même si c'est une bombe nucléaire pour tuer une mouche :

                                                      -> Moteur de script Groovy : http://www.groovy-lang.org/

                                                      A partir de là, tu peux créer un script "modèle" qui contient une méthode "evaluate()" avec un texte "pattern" ( par exemple => return "#TO_EVAL#" ; ) que tu remplaces par ce que tu veux évaluer ( replace("#TO_EVAL#, ma_condition) ). Tu peux vérifier la validité du script avant l'appel... Tu appelles la méthode du script .groovy et tu récupères le résultat. Tu trouveras des exemples si tu demandes à Google.

                                                      -
                                                      Edité par CeBiM il y a environ 4 heures


                                                      Merci, en effet cela me parrait être une "grosse" solution (d'autant que je n'ai pas tout compris). Donc si j'ai bien compris avec Groovy tu peux exécuter du code contenu dans un String grâce à une méthode replace ? Par exemple si je fais replace(#TO_EVAL#, "System.out.println( 'hello world' );") cela reviens au même que de faire System.out.println( 'hello world'); ? Si oui c'est exactement ce que je veux.


                                                      Fredo54 a écrit:

                                                      necbfrt a écrit:

                                                      Désolé de te faire répéter mais je n'ai pas compris ta solution, tu me conseille d'utiliser un dictionnaire mais ensuite je ne comprend pas quoi faire. Si j'ai bien compris tu me conseille de faire ceci :

                                                      Map<String,String> dico;
                                                      
                                                      for(boucle sur toutes les clé de dico)
                                                      {
                                                         if( clé ==vrai)
                                                             traitementContenuDansDico();
                                                      }

                                                      Non ça ressemblerait plutôt à

                                                      Map<String,String[]> dico;
                                                      
                                                      for(traitement dans dico)
                                                      {
                                                         if(condition dans conditions possibles)
                                                             traitement();
                                                             break;
                                                      }
                                                      • où traitement est un objet fonction non exécuté (mettre les parenthèses comme ci-dessus pour son exécution).
                                                      • où conditions possibles est la liste des condition où le traitement s'appliquera donc dico[traitement]
                                                      • où les clés représentent les traitements

                                                      Bref avec le vrai problème ça serait plus simple à expliquer :-°


                                                      Mon problème reste toujours identique, en prenant par exemple la ligne "if(condition dans conditions possibles)", comment je peux tester "condition dans conditions possibles" sachant que par exemple condition sera un String qui vaut "a==1 && b==2"

                                                      Le vrai problème c'est cela : exécuter n'importe quelle ligne de code java en la contenant dans un String, et ceci peu importe l'utilisation que j'en ferais, si je veux faire :

                                                      if(true)
                                                      {
                                                         System.out.println( "hello world");
                                                      }

                                                      Je veux pouvoir faire

                                                      String codeJava="if(true){System.out.println( "hello world");}";
                                                      
                                                      executeToutCodeJavaPossible(codeJava);

                                                      avec la fonction executeToutCodeJavaPossible qui prend en argument un String et qui exécute le contenu du String.



                                                      • Partager sur Facebook
                                                      • Partager sur Twitter
                                                        8 novembre 2018 à 15:43:38

                                                        necbfrt a écrit: > Merci, en effet cela me parrait être une "grosse" solution (d'autant que je n'ai pas tout compris). Donc si j'ai bien compris avec Groovy tu peux exécuter du code contenu dans un String grâce à une méthode replace ? Par exemple si je fais replace(#TO_EVAL#, "System.out.println( 'hello world' );") cela reviens au même que de faire System.out.println( 'hello world'); ? Si oui c'est exactement ce que je veux.

                                                        Non..pas tout à fait...Groovy est un moteur de script dont le langage est directement interprété par la JVM. Tu peux écrire des scripts dans un fichier, dans un String...ou tu veux (ou presque) et l'exécuter avec Groovy. La syntaxe est sensiblement la même que Java avec un peu plus de "sucre". Tu peux écrire un script qui contient du code Java sans soucis. Pour ton problème d'évaluation de conditions, tu peux écrire un script qui contient une fonction ("testCondition" par exemple) qui prend en arguments les éléments de ta condition, et modifier le script, en remplaçant un "mot-clef" ("#EVAL#" par exemple). Tu peux même mettre un mot clef pour modifier les paramètres pour être plus polyvalent.

                                                        Exemple de script :

                                                        boolean testCondition(#PARAMETERS#) { return #EVAL#; }

                                                        Fin exemple de script...

                                                        Dans ton cas tu remplaces "#PARAMETERS#" par "boolean b" et "#EVAL#" par "b == true" ( ou juste "b" qui suffit pour cet exemple).

                                                        -> monScriptDansUnString.replace("#PARAMETERS#", "boolean b")

                                                        -> monScriptDansUnString.replace("#EVAL#", "b == true")

                                                        Tu lances la fonction qui est dans ton script , tu récupères le résultat et le tour est joué.

                                                        Une fois que tu as créé tout ce qui va bien (les objets qui contiennent le script et permettent son éxecution), tu peux faire (grossièrement, "groovyObject" contient ton script) :

                                                        Object ret = groovyObject.invokeMethod("testCondition", b);

                                                        System.out.println("Résultat condition = " + (Boolean)ret);

                                                        C'est à titre d'exemple, dans celui que j'ai copié/collé, il faut créer une classe dans un fichier (ou String) .groovy et la "charger" dans le "groovyObject". Mais je crois qu'il est possible d'écrire du code directement dans le fichier (ou String), sans écrire de classe, et par défaut, la dernière variable évaluée est renvoyée par l'exécution du script.-> A vérifier...

                                                        Si tu veux plus d'infos ---> RTFM

                                                        -
                                                        Edité par CeBiM 8 novembre 2018 à 16:19:04

                                                        • Partager sur Facebook
                                                        • Partager sur Twitter
                                                        Les seules questions bêtes sont celles qui ne sont pas posées. Mieux vaut paraître bête une fois que de le rester à vie."Vis comme si tu devais mourir demain. Apprends comme si tu devais vivre toujours."
                                                          8 novembre 2018 à 15:45:10

                                                          necbfrt a écrit:

                                                          CeBiM a écrit:

                                                          Bonjour,

                                                          J'ai lu en diagonal, donc désolé si la réponse n'est pas parfaitement adaptée au problème. Mais, pour proposer une solution qui y répond...même si c'est une bombe nucléaire pour tuer une mouche :

                                                          -> Moteur de script Groovy : http://www.groovy-lang.org/

                                                          A partir de là, tu peux créer un script "modèle" qui contient une méthode "evaluate()" avec un texte "pattern" ( par exemple => return "#TO_EVAL#" ; ) que tu remplaces par ce que tu veux évaluer ( replace("#TO_EVAL#, ma_condition) ). Tu peux vérifier la validité du script avant l'appel... Tu appelles la méthode du script .groovy et tu récupères le résultat. Tu trouveras des exemples si tu demandes à Google.

                                                          -
                                                          Edité par CeBiM il y a environ 4 heures


                                                          Merci, en effet cela me parrait être une "grosse" solution (d'autant que je n'ai pas tout compris). Donc si j'ai bien compris avec Groovy tu peux exécuter du code contenu dans un String grâce à une méthode replace ? Par exemple si je fais replace(#TO_EVAL#, "System.out.println( 'hello world' );") cela reviens au même que de faire System.out.println( 'hello world'); ? Si oui c'est exactement ce que je veux.


                                                          Fredo54 a écrit:

                                                          necbfrt a écrit:

                                                          Désolé de te faire répéter mais je n'ai pas compris ta solution, tu me conseille d'utiliser un dictionnaire mais ensuite je ne comprend pas quoi faire. Si j'ai bien compris tu me conseille de faire ceci :

                                                          Map<String,String> dico;
                                                          
                                                          for(boucle sur toutes les clé de dico)
                                                          {
                                                             if( clé ==vrai)
                                                                 traitementContenuDansDico();
                                                          }

                                                          Non ça ressemblerait plutôt à

                                                          Map<String,String[]> dico;
                                                          
                                                          for(traitement dans dico)
                                                          {
                                                             if(condition dans conditions possibles)
                                                                 traitement();
                                                                 break;
                                                          }
                                                          • où traitement est un objet fonction non exécuté (mettre les parenthèses comme ci-dessus pour son exécution).
                                                          • où conditions possibles est la liste des condition où le traitement s'appliquera donc dico[traitement]
                                                          • où les clés représentent les traitements

                                                          Bref avec le vrai problème ça serait plus simple à expliquer :-°


                                                          Mon problème reste toujours identique, en prenant par exemple la ligne "if(condition dans conditions possibles)", comment je peux tester "condition dans conditions possibles" sachant que par exemple condition sera un String qui vaut "a==1 && b==2"

                                                          Le vrai problème c'est cela : exécuter n'importe quelle ligne de code java en la contenant dans un String, et ceci peu importe l'utilisation que j'en ferais, si je veux faire :

                                                          if(true)
                                                          {
                                                             System.out.println( "hello world");
                                                          }

                                                          Je veux pouvoir faire

                                                          String codeJava="if(true){System.out.println( "hello world");}";
                                                          
                                                          executeToutCodeJavaPossible(codeJava);

                                                          avec la fonction executeToutCodeJavaPossible qui prend en argument un String et qui exécute le contenu du String.


                                                          Le reel probleme n'est pas de parser le code en string , c'est de faire un lien entre ton string et tes variable java.
                                                          Par exemple ton : if(b==True) .. ton parseur devra savoir a quel variable reel appartient le 'b'. Pour ca ca te prendra une architecture pour mapper des strings a des variables..

                                                          • Partager sur Facebook
                                                          • Partager sur Twitter
                                                            8 novembre 2018 à 16:20:23

                                                            Zérotisme a écrit: > Le reel probleme n'est pas de parser le code en string , c'est de faire un lien entre ton string et tes variable java. Par exemple ton : if(b==True) .. ton parseur devra savoir a quel variable reel appartient le 'b'. Pour ca ca te prendra une architecture pour mapper des strings a des variables..

                                                            Si tu mets les variables en tant que paramètres d'une méthode d'un script Groovy...pas besoin de mapping.

                                                            Groovy s'intègre facilement à un projet Java et permet d’exécuter du code contenu dans un "String". Le code peut être écrit en Java, ou avec la syntaxe de Groovy ( qui est du Java "simplifié" avec du sucre syntaxique ).

                                                            Si tu as une String qui contient "System.out.println(\"Toto\")", et que tu l'exécutes avec Groovy, ça fera ce que tu attends...une écriture sur la sortie standard.

                                                            Je rejoins ce que dit @SébastienGRENIER1 :

                                                            Soit tu fais ton "parseur" et c'est peut-être plus performant, car entièrement dédié à ta problématique. Soit tu utilises un moteur de script (comme Groovy), qui peut "alourdir" un peu le projet, mais qui permet une grande polyvalence.

                                                            Perso, j'opterais pour le moteur de script...Tu gagneras en tant de développement, et tu pourras plus facilement adapter le moteur de script (ou juste les scripts) à tes besoins que d'adapter ton "parseur"...Développer un "parseur" toi-même peut être long, et tu peux y avoir des erreurs et des bugs que tu n'auras pas avec le moteur de script. De plus, le moteur de script peut répondre à pleins (pleins pleins pleins...etc...) de besoins futurs, alors que ton "parseur" non (configurer ton appli avec un script par exemple)...De plus, si tu as créer un "jar" exécutable, tu n'as pas besoin de le re-créer pour adapter quelque chose...juste besoin de modifier des scripts...alors qu'avec une solution dédié (évaluateur récursif par exemple), tu devras refaire ton "jar".

                                                            -
                                                            Edité par CeBiM 8 novembre 2018 à 16:47:43

                                                            • Partager sur Facebook
                                                            • Partager sur Twitter
                                                            Les seules questions bêtes sont celles qui ne sont pas posées. Mieux vaut paraître bête une fois que de le rester à vie."Vis comme si tu devais mourir demain. Apprends comme si tu devais vivre toujours."
                                                              8 novembre 2018 à 21:44:04

                                                              Je dois parler en chinois, bref !

                                                              Je prends ton exemple,

                                                              Pour chaque traitement dans dictionnaire
                                                                  Si "a==1 && b==2" dans dictionnaire[traitement]
                                                                      executer(traitement)
                                                              
                                                              # dictionnaire[traitement] contient la liste des conditions possibles pour exécuter le traitement.
                                                              # traitement est la clé du dictionnaire

                                                              Je n'en reviens pas que certains ici proposent d'appuyer une solution aussi crade et aussi peu conceptuelle que l'évaluation d'une chaîne de caractères en code java.

                                                              • Partager sur Facebook
                                                              • Partager sur Twitter

                                                              Bonne journée...

                                                              Condition if avec un string comme condition

                                                              × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
                                                              × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
                                                              • Editeur
                                                              • Markdown