IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

API standards et tierces Java Discussion :

[Maths] Evaluation String en Boolean


Sujet :

API standards et tierces Java

  1. #1
    Nouveau Candidat au Club
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    6
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2007
    Messages : 6
    Points : 1
    Points
    1
    Par défaut [Maths] Evaluation String en Boolean
    Bonjour tout le monde !

    J'ai une question fondamentale pour le programme que je suis en train d'écrire : est-il possible de réellement convertir un String en Boolean ? Je veux dire par là que, toutes les méthodes style valueOf, parseBoolean, etc. renvoie true si le string vaut "true" et false pour le reste.

    En fait, j'ai un string qui contient une condition : "a<b" (a et b deux entiers)
    Et je voudrais que mon booléen me dise si cette condition est vérifiée, et non pas qu'il me dise si le string vaut "true" ou pas. En gros :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    // Au départ
    String condition="a<b"
    ...
    // A l'arrivée
    boolean verifcondition=(a<b)
    Je suis désespéré de trouver une solution !
    Merci d'avance !

    Rémi

  2. #2
    Membre averti
    Inscrit en
    Mai 2006
    Messages
    423
    Détails du profil
    Informations forums :
    Inscription : Mai 2006
    Messages : 423
    Points : 303
    Points
    303
    Par défaut
    salut,
    a et b représente quoi?

  3. #3
    Nouveau Candidat au Club
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    6
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2007
    Messages : 6
    Points : 1
    Points
    1
    Par défaut
    Ce sont deux entiers. Je veux savoir si l'un est inférieur à l'autre.

  4. #4
    Membre habitué Avatar de nicgando
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    128
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Mars 2006
    Messages : 128
    Points : 163
    Points
    163
    Par défaut
    Tu essayes d'interpréter des String comme des fonctions mathématiques si j'ai bien compris

    A ce moment là utilise JEP

  5. #5
    Membre averti
    Inscrit en
    Mai 2006
    Messages
    423
    Détails du profil
    Informations forums :
    Inscription : Mai 2006
    Messages : 423
    Points : 303
    Points
    303
    Par défaut
    salut,
    je ne comprend pourquoi tu traite la condition comme String.

    tu peut extraire a et b et le signe de comparaison en faisant des opération sur la chaine et puis. cherche commen les convertir en int. et fait ton test

  6. #6
    Nouveau Candidat au Club
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    6
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2007
    Messages : 6
    Points : 1
    Points
    1
    Par défaut
    En fait, je traite les conditions sous forme de strings car c'est le seul moyen que j'ai trouvé pour que mon programme fonctionne. Je m'explique : l'utilisateur doit rentrer des contraintes (a<b, a<c, etc.) et celles-ci doivent être toutes vérifiées pour des valeurs de a, b, c, etc. qui varient. Or je ne vois pas comment rentrer des contraintes directement sous forme booléenne. Je pensais donc les rentrer d'abord sous forme de string ("a<b", "a<c") puis de les convertir en booléen au moment du contrôle (après que des valeurs à a, b, c aient été attribuées). D'autant plus que, si je les rentre directement en booléen (au début, quand l'utilisateur rentre ses contraintes), leur valeur va être fixe (et directement false puisque les valeurs de a, b, c n'ont pas encore été données).
    J'espère que c'est assez clair

  7. #7
    Membre averti
    Inscrit en
    Mai 2006
    Messages
    423
    Détails du profil
    Informations forums :
    Inscription : Mai 2006
    Messages : 423
    Points : 303
    Points
    303
    Par défaut
    salut,
    pourquoi tu ne deman de pas à l'utilisateur d'entre le premier entier a puis le deuxième entier b puis un char '<' ou '>'... et tu fait un switch sur le char:
    si char =='<' alors
    booleen B = a<b etc...

  8. #8
    Nouveau Candidat au Club
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    6
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2007
    Messages : 6
    Points : 1
    Points
    1
    Par défaut
    En fait, une boucle for va affecter une valeur à chacun des deux entiers a et b (par exemple entre 0 et 3) et je veux savoir quand est-ce qu'une contrainte (par exemple a<b) est vérifiée pour les différentes valeurs de a et b, sachant que cette contrainte est tapée par l'utilisateur lui-même en exécutant le programme (c'est ça qui me bloque), elle n'est pas écrite directement dans le code du programme.
    Et je ne vois pas comment rentrer les contraintes autrement que sous forme de strings.

  9. #9
    Membre averti
    Inscrit en
    Mai 2006
    Messages
    423
    Détails du profil
    Informations forums :
    Inscription : Mai 2006
    Messages : 423
    Points : 303
    Points
    303
    Par défaut
    salut,
    d'après ce que j'ai compris.
    a et b prennet des valeurs aléatoires dans le programme. alors il suffit de damnder à l'utilisateur d'entrer le signe de contrainte seulement sous forme de char et comme je t'ai dit test sur la valeur de la contrainte :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    switch (contrainte)
    {
    case '<' : traitement
    case '>' : traitement
    }
    si j'ai bien compri, ou bien tu peut nous donner un exemple pratique d'éxécution pour mieux comprendre le problème.

  10. #10
    Nouveau Candidat au Club
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    6
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2007
    Messages : 6
    Points : 1
    Points
    1
    Par défaut
    Tout d'abord, merci pour tes réponses mehdiing

    En réalité, je rédige le classique programme de classification des tâches. On a genre 5 tâches t1, t2, t3, t4, t5. Je veux que t1 soit avant t2 (schématiquement "t1<t2"), t4 avant t3 ("t4<t3"), t4 avant t1 ("t4<t1"), et le programme va me déduire les ordres possibles qui respectent ces contraintes.
    Les parties vérification des contraintes et listage des ordres possibles sont pleinement fonctionnelles. C'est la partie entrée des contraintes qui me fait défaut.
    Si j'ai compris ce que tu me proposes de faire, c'est que l'utilisateur indique juste le char '<' ou '>' entre chaque couple de tâches ? Par exemple (a, b, c, d, e symbolisent rescpectivement le numéro de place que les tâches t1, t2, t3, t4, t5 occupent dans la liste des tâches ordonnées) :
    - a<b
    - a<c
    - a d (si je n'ai aucune contrainte entre a et d, je laisserai un blanc ?)
    - a>e
    - b<c
    - etc.

  11. #11
    Rédacteur
    Avatar de CyberChouan
    Homme Profil pro
    Directeur technique
    Inscrit en
    Janvier 2007
    Messages
    2 752
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Directeur technique
    Secteur : Communication - Médias

    Informations forums :
    Inscription : Janvier 2007
    Messages : 2 752
    Points : 4 314
    Points
    4 314
    Par défaut
    J'ai déjà eu le même problème que toi:

    l'application était paramétrée par un fichier XML
    celui-ci contenait la description des traitements que l'application devait effectuer.
    certains traitement étaient effectués sur condition, qui était donnée dans le XML par un attribut condition sur la balise, du genre "a < b"

    Pour traiter ce problème, j'ai écrit un package de classes dédiées:

    - chaque type de condition (égalité, supérieur, inférieur, etc.) est géré par une classe dédiée à cette condition capable de renvoyer le résultat de l'évaluation de la condition

    - la condition est analysée par un parseur utilisant des expressions régulières: celui-ci détecte le type de condition, et genère une instance de la bonne classe, en lui donnant en prime les deux variables pour lesquelles on doit vérifier la condition

    -------

    Dans ton problème, il n'y a pas de fichier XML mais je pense que tu peux appliquer la même démarche.
    Dans mon cas ça fonctionne très bien... et mon application étant complexe, je vérifie ainsi des conditions assez tordues:
    - existence d'un objet dans une liste
    - vérification de formules logiques ("a < b ET c > d"): pour ce genre de condition, j'effectue mon parsing de façon récursive jusqu'à arriver à des conditions unitaires

  12. #12
    Nouveau Candidat au Club
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    6
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2007
    Messages : 6
    Points : 1
    Points
    1
    Par défaut
    Merci beaucoup pour vos réponses ! Je n'ai pas tout compris à ce que tu as fait CyberChouan... mais je viens à l'instant de trouver une solution pour mon problème !
    En fait mehdiing et toi, vous m'avez donné une idée qui se rapproche un peu de votre principe : parcourir le string pour déterminer la contrainte.

    J'ai symbolisé toutes mes contraintes sous la forme de strings "0<1", "1<3", "3<2", etc. où les nombres symbolisent le numéro de chaque tâche. L'utilisateur tape donc ces strings à l'aide de la console (readLine()). A l'aide d'un charAt, je regarde les nombres qui sont contenus dans chaque string. Je les convertis en int. Et je crée mon booléen du type a<b au moment venu avec a et b nombres fonctions des deux entiers que je viens de trouver.

    Et ça marche nickel ! Ce n'est pas aussi puissant que ce que je souhaitais faire au départ, mais ça me suffit pour mon programme
    Encore merci et à bientôt !

  13. #13
    Futur Membre du Club
    Homme Profil pro
    Conception d'apps iOS & Android
    Inscrit en
    Mai 2003
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : Canada

    Informations professionnelles :
    Activité : Conception d'apps iOS & Android
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2003
    Messages : 6
    Points : 5
    Points
    5
    Par défaut exemple simple en java (pas essayé la compilation)
    voici une piste de solution encore plus simple (je crois) pour toi

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
     
    String condition = "a>c";
    Matcher m = Pattern.compile("^(.*?)\\s*([<>!=]{1}[=]?)\\s*(.*?)$").matcher(condition);
    boolean ok = m.matches();
     
    // m.group(1) = "a"
    // m.group(2) = ">"
    // m.group(3) = "c"
      List<String> params = new ArrayList<String>();
      params.add(la valeur de ce que représente m.group(1) dans une String);
        // si a=6 : params.add(String(6));
      params.add(m.group(2)); // la condition
      params.add(la valeur de ce que représente m.group(3) dans une String);
      ScriptEngineManager mgr = new ScriptEngineManager();
      ScriptEngine jsEngine = mgr.getEngineByName("JavaScript");
      Invocable invocableEngine = (Invocable)jsEngine;
    try {
      jsEngine.eval("function evaluer(params) {" +
                    "  var p = params.toArray();" +
                    "  return eval(p[0] + p[1] + p[2]);" +
                    "}");
      boolean resultat = (boolean)invocableEngine.invokeFunction("evaluer", params);
    }
    catch (ScriptException ex) {
      ex.printStackTrace();
    }

Discussions similaires

  1. [C# 1.1]Analyse de formule logique (string to boolean)
    Par le_ben dans le forum Windows Forms
    Réponses: 2
    Dernier message: 21/11/2008, 09h52
  2. Evaluer String et renvoi booléen ! Cela existe ?
    Par nono44200 dans le forum API standards et tierces
    Réponses: 5
    Dernier message: 21/03/2008, 14h11
  3. [Maths] evaluer une chaine de caractère
    Par davyondo dans le forum API standards et tierces
    Réponses: 3
    Dernier message: 06/11/2007, 14h53
  4. if imbriqué impossible /!\ string et boolean
    Par avogadro dans le forum Langage
    Réponses: 5
    Dernier message: 04/05/2006, 18h13
  5. Comment convertir une string en boolean ?
    Par olivier12345600 dans le forum Langage
    Réponses: 6
    Dernier message: 25/06/2005, 15h54

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo